我正在阅读有关最终变量的内容,并了解到当您将参数作为final时,您无法更改它。但后来我尝试了一些东西
编译器在这里抱怨说你不能改变我能理解的最终参数
public class FinalVariableTest {
public void method1(final FinalVariableTest object){
object = new FinalVariableTest(); //Not allowed, compiler complains
}
public void method2(FinalVariableTest object){
object = new FinalVariableTest();
}
public static void main(String[] args) {
FinalVariableTest test = new FinalVariableTest();
test.method1(test);
}
}
但编译器对此
没问题public class FinalVariableTest {
public void method1(final FinalVariableTest object){
method2(object);
}
public void method2(FinalVariableTest object){
object = new FinalVariableTest(); //Compiler does not complain
}
public static void main(String[] args) {
FinalVariableTest test = new FinalVariableTest();
test.method1(test);
}
}
这背后的原因是什么?
答案 0 :(得分:4)
关键字final
意味着您无法将变量中保存的引用更改为另一个对象(原始类型除外),而不是您无法更改引用的对象本身。
在您的示例中,您无法更改object
中指向的method1()
变量,但您确实可以更改object
中method2()
变量指向的内容,因为那个不是final
。在整个过程中,您可以自由地更改被引用/指向的对象,除非该对象本身具有针对它的保护。
final method1.object -- cannot point elsewhere
\ method2.object -- not final, can be switched to here --.
\ / |
\ / |
original FinalVariableTest instance new FinalVariableTest()
答案 1 :(得分:0)
您不会更改curl
范围内的对象,只会在method1
的范围内。从这个意义上说,在代码中调用method2之后,method1中的对象仍然是原始(最终)对象,而不是在method2中创建的对象