为什么这个程序输出1?

lim*_*ess 2 java oop

我看过这段代码,我不明白为什么这个程序会打印出来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,则变量mainfinal.因此main,如果您myObject = somethingElse;在设置其值的初始行之后添加,则无法编译,因为您无法在变量中添加新值.这对变量引用的对象是否可变是没有影响的.

第二件事,在foo()完成之后,我们将myObject变为空,那么我们怎样才能打印出来呢?

您的代码中调用了两个单独的东西myObject:

  1. 一个变量 main

  2. 一个参数 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).