我正在阅读有关final变量的信息,并了解到当您将参数作为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);
}
}
这背后的原因是什么?
关键字final
意味着您不能将变量中包含的引用更改为另一个对象(撇开原始类型),而不是不能更改引用对象本身。
在您的示例中,您无法更改object
inmethod1()
指向的变量,但实际上可以更改object
inmethod2()
指向的变量,因为那个不是final
。而整个过程中,你可以自由地改变对象被引用/指向,除非对象本身具有保护反对。
final method1.object -- cannot point elsewhere
\ method2.object -- not final, can be switched to here --.
\ / |
\ / |
original FinalVariableTest instance new FinalVariableTest()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句