在没有最终参数声明的情况下将最终参数传递给另一个方法

Sne*_*neh 3 java 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是编译器对此很好

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这背后的原因是什么?

Jir*_*sek 5

关键字final意味着您不能将变量中保存的引用更改为另一个对象(原始类型除外),而不是您不能更改被引用对象本身。

在您的示例中,您无法更改objectinmethod1()所指向的变量,但您确实可以更改objectinmethod2()所指向的变量,因为该变量不是final. 并且在整个过程中,您可以自由地更改被引用/指向的对象,除非该对象本身具有针对它的保护。

final method1.object -- cannot point elsewhere
             \                    method2.object -- not final, can be switched to here --.
              \                  /                                                       |
               \                /                                                        |
           original FinalVariableTest instance                       new FinalVariableTest()
Run Code Online (Sandbox Code Playgroud)