<分区>
所以我可以完全理解为什么你可能想要让你的类final
。想象一下 String 类不是最终的,并且您有一个库,其中有一个方法将 String 作为参数并依赖于 length()。某些操作的方法,但有人扩展了 String 类并覆盖了长度以始终返回 -1..
但我不明白为什么有人会声明方法的参数为 final。 Java 无论如何都是按值传递的,所以如果参数是原始参数,它已经是最终的(某种意义上)。如果你传递的是引用类型,它是否向方法的调用者保证任何事情?我不这么认为..
void foo(final List<Object> o) {
o.add(new Object());
} // oops?
所以 final
防止了以下情况:
void foo(final List<Object> o) {
o = new ArrayList();
}
但我为什么要这样做呢?我总是可以创建一个新变量,并且它不会将新对象分配给调用者的变量吗? (我的意思是,无论如何我都无法更改调用者引用所指的内容,即使参数未声明为 final..)
我的问题是,方法声明中最终参数的用途是什么?是给来电者的吗?它能保证什么吗?
我还发现奇怪的是下面的代码可以正常编译:
public interface MyInterface {
void foo(final Object o);
}
class MyImpl implements MyInterface {
@Override
public void foo(Object o) { // final in interface, not final in impl..
}
}
但一旦我理解了我的主要问题,它也许就有意义了。