问题
这个问题在这里已有答案:
- 为什么我要在Java中的方法参数上使用关键字"final"? 12个答案
我经常遇到如下所示的方法:
public void foo(final String a, final int[] b, final Object1 c){
}
如果在不传递最终参数的情况下调用此方法会发生什么。即稍后更改的Object1(因此未声明为final)可以很好地传递给此方法
#1 热门回答(138 赞)
在将参数发送到方法之前,Java总是复制参数。这意味着最终并不意味着调用代码有任何区别。这仅意味着在方法内部无法重新分配变量。 (请注意,如果你有最终对象,则仍可以更改对象的属性)。
#2 热门回答(73 赞)
有一种情况,你需要**来声明它最终 - 否则会导致编译错误 - 即将它们传递给匿名类。基本示例:
public FileFilter createFileExtensionFilter(final String extension) {
FileFilter fileFilter = new FileFilter() {
public boolean accept(File pathname) {
return pathname.getName().endsWith(extension);
}
};
// What would happen when it's allowed to change extension here?
// extension = "foo";
return fileFilter;
}
删除final
修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改值将导致匿名类实例在创建之后表现不同。
#3 热门回答(47 赞)
Java只是按值传递。 (或更好 - 按值传递参考)
因此传递的参数和方法中的参数是指向同一对象(值)的两个不同的处理程序。
因此,如果更改对象的状态,它将反映到引用它的每个其他变量。但是,如果为参数重新分配新对象(值),则不会重新分配指向此对象(值)的其他变量。