我看过这段代码,我不明白为什么这个程序会打印出来1.
首先,在foo(myObject)我们正在分配最终的东西时,这怎么可能?
第二件事,在foo()完成之后,我们将myObject变为空,那么我们怎样才能打印出来呢?
public class MyClass {
private int myInt;
public static void foo(MyClass myObject) {
myObject.myInt = 1;
myObject = null;
}
public static void main(String[] args) {
final MyClass myObject = new MyClass();
myObject.myInt = 2;
foo(myObject);
System.out.println(myObject.myInt);
}
}
Run Code Online (Sandbox Code Playgroud)
T.J*_*der 10
首先,在
foo(myObject)我们分配的东西中final,它是如何存在的?
的对象是不final,则变量中main是final.因此main,如果您myObject = somethingElse;在设置其值的初始行之后添加,则无法编译,因为您无法在变量中添加新值.这对变量引用的对象是否可变是没有影响的.
第二件事,在
foo()完成之后,我们将myObject变为空,那么我们怎样才能打印出来呢?
您的代码中调用了两个单独的东西myObject:
一个变量 main
一个参数 foo
您的代码foo将参数设置为null,但这对变量没有任何影响main.(事实上,foo对变量产生任何影响都是不可能的main; Java是一种纯粹的按值传递的语言.foo正如你所演示的那样,所有人都可以修改变量和变量的对象状态.参数引用,使用传入其中的对象引用作为参数.)
让我们在此行之前停止您的代码foo:
myObject.myInt = 1;
Run Code Online (Sandbox Code Playgroud)
这就是我们在记忆中所拥有的东西(遗漏了一些细节和无关紧要):
+??????????????????????+
| variable "myObject" | foo can change the
+??????????????????????+ *state* of this
foo can't change this??>| Ref22458 |???+ |
+??????????????????????+ | v
| +????????????????????????+
+??????????????????????+ +???>| object of type MyClass |
| parameter "myObject" | | +????????????????????????+
+??????????????????????+ | | myInt: 2 |
foo can change this????>| Ref22458 |???+ +????????????????????????+
+??????????????????????+
...其中"Ref22458"只是指向您创建的对象的对象引用值的名称main.
一旦我们执行了两行foo:
myObject.myInt = 1;
myObject = null;
Run Code Online (Sandbox Code Playgroud)
我们在内存中有这个:
+??????????????????????+
| variable "myObject" | foo can change the
+??????????????????????+ *state* of this
foo can't change this??>| Ref22458 |???+ |
+??????????????????????+ | v
| +????????????????????????+
+??????????????????????+ +???>| object of type MyClass |
| parameter "myObject" | | +????????????????????????+
+??????????????????????+ | | myInt: 1 |
foo can change this????>| null |???+ +????????????????????????+
+??????????????????????+
注意如何foo更改对象的状态(myInt现在是1),并且可以更改参数中 的值myObject(现在是null),但无法更改变量 中的值myObject(原因有两个:它无法访问变量[ Java是按值传递的,而变量是final).