在没有最终参数声明的情况下将最终参数传递给另一个方法
Passing final parameters to another method without final parameter declaration
我正在阅读有关 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
的意思是不能将变量中持有的reference更改为另一个对象(抛开原始类型),并不是说不能更改被引用的对象本身。
在您的示例中,您无法更改 method1()
中的 object
变量所指向的内容,但您确实可以更改 method2()
中的 object
变量所指向的内容at,因为那个不是 final
。在整个过程中,您可以自由更改被引用/指向的 对象 ,除非该对象本身具有针对它的保护。
final method1.object -- cannot point elsewhere
\ method2.object -- not final, can be switched to here --.
\ / |
\ / |
original FinalVariableTest instance new FinalVariableTest()
您没有更改 method1
范围内的对象,仅在 method2
范围内更改对象。从这个意义上讲,在您的代码中调用 method2 之后,method1 中的对象仍将是原始(最终)对象,而不是在 method2
中创建的对象
我正在阅读有关 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
的意思是不能将变量中持有的reference更改为另一个对象(抛开原始类型),并不是说不能更改被引用的对象本身。
在您的示例中,您无法更改 method1()
中的 object
变量所指向的内容,但您确实可以更改 method2()
中的 object
变量所指向的内容at,因为那个不是 final
。在整个过程中,您可以自由更改被引用/指向的 对象 ,除非该对象本身具有针对它的保护。
final method1.object -- cannot point elsewhere
\ method2.object -- not final, can be switched to here --.
\ / |
\ / |
original FinalVariableTest instance new FinalVariableTest()
您没有更改 method1
范围内的对象,仅在 method2
范围内更改对象。从这个意义上讲,在您的代码中调用 method2 之后,method1 中的对象仍将是原始(最终)对象,而不是在 method2