我经常遇到类似如下的方法:
public void foo(final String a, final int[] b, final Object1 c){
}如果在不传递最终参数的情况下调用此方法会发生什么情况。也就是说,稍后更改的Object1 (因此不会声明为final)可以很好地传递给此方法
发布于 2010-02-10 20:08:28
Java总是在将参数发送给方法之前对其进行复制。这意味着对于调用代码来说,最终结果并没有什么不同。这只意味着在方法中变量不能被重新赋值。
请注意,如果您有一个最终对象,您仍然可以更改该对象的属性。这是因为Java中的对象实际上是指向对象的指针。并且只复制指针(并且在您的方法中将是最终的),而不是实际的对象。
发布于 2010-02-10 20:16:46
在这种情况下,您需要将其声明为,否则将导致编译错误,即将它们传递到匿名类中。基本示例:
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修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改该值将导致匿名类实例在创建后的行为有所不同。
发布于 2010-02-10 20:08:02
Java只是按值传递的。(或者更好的-通过值传递引用)
因此,传递的参数和方法中的参数是指向同一对象(值)的两个不同的处理程序。
因此,如果您更改对象的状态,它会反映到引用它的所有其他变量。但是,如果将新对象(值)重新赋值给参数,则指向此对象(值)的其他变量不会被重新赋值。
https://stackoverflow.com/questions/2236599
复制相似问题