为什么这个java应用程序打印"true"?

Kea*_*ang 3 java

这是我的第一个Hello.java类

public class Hello {
    String name = "";
}
Run Code Online (Sandbox Code Playgroud)

这是我的第二个Class Test1.java

public class Test1 {    
    public static void main(String[] args) {
        Hello h = new Hello();
        Test1 t = new Test1();
        t.build(h);
        System.out.println(h.name);
    }
    void build(Hello h){
        h.name = "me";
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行Test1.java时,它会打印"我".我想我理解,因为"参考转移".

这是我的第三个Class Test2.java

public class Test2 {
    public static void main(String[] args) {
        Hello h = null;
        Test2 t = new Test2();
        t.build(h);
        System.out.println(h == null);
    }
    void build(Hello h){
        h = new Hello();
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行Test2.java时,它打印"true",为什么?是不是"参考转移"?我很迷惑.

Joh*_*iss 7

您可能知道,Java是按值调用的.Wenn你传递了一个引用,该引用被复制了.可以肯定:引用本身而不是引用的目标被复制.

我们来看看您的第一个示例:调用时build(),h将复制引用.因为h(副本build())不会被覆盖在某处build(),它总是指向原始的内存位置h.所以变化h.name会影响原作h.

示例2不同:引用也h被复制.但h被覆盖了build().其效果是,原来hhbuild()指向不同的内存位置!的hbuild()指向新生成的Hello对象,这将在垃圾方法的返回后somewhen收集build().