3 回答
TA贡献1794条经验 获得超7个赞
Java总是在将参数发送给方法之前先对其进行复制。这意味着最终的调用代码并不意味着任何区别。这仅意味着无法在方法内部重新分配变量。(请注意,如果您有最终对象,则仍然可以更改对象的属性)。
TA贡献2011条经验 获得超2个赞
在某些情况下,您需要将其声明为final(否则将导致编译错误),即将它们传递给匿名类。基本示例:
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修饰符将导致编译错误,因为不再保证该值是运行时常量。从匿名类外部更改值将导致匿名类实例在创建后表现不同。
TA贡献1811条经验 获得超6个赞
考虑以下foo()的实现:
public void foo(final String a) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
System.out.print(a);
}
});
}
因为Runnable实例将超出方法的寿命,所以没有final关键字就无法编译- final告诉编译器可以安全地复制引用(以后再引用)。因此,将参考视为最终参考,而不是value。换句话说:作为呼叫者,您无法搞乱任何事情...
添加回答
举报