有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

这是我的第一节课你好。爪哇

public class Hello {
    String name = "";
}

这是我的二级测试1。爪哇

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";
    }
}

当我运行Test1时。java,它打印“我”。我想我明白了,因为“转介”

这是我的第三级测试2。爪哇

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();
    }
}

当我运行Test2时。java,它打印“真”,为什么?不再是“参考转移”了吗?我很困惑


共 (6) 个答案

  1. # 1 楼答案

    h.name = "me"更改h引用的对象。此更改将在引用同一对象的任何其他位置可见h = new Hello()使h引用另一个(新)对象。此更改仅影响该特定变量h,而不影响之前引用同一对象的任何其他变量

  2. # 2 楼答案

    Java总是通过值传递。当有引用时,它只传递指向同一对象的引用副本。在这种情况下,你只是复制了另一个对象。这就是为什么你原来的那个没有改变

  3. # 3 楼答案

    您可能知道,Java是按值调用的。当你传递一个引用时,引用会被复制。可以肯定的是:引用本身和而不是引用的目标会被复制

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

    示例2不同:引用h也会被复制。但是hbuild()中被覆盖。结果是原始的hbuild()中的h指向不同的内存位置!build()中的h指向新生成的Hello对象,在返回方法build()后的某个时候,该对象将被垃圾收集

  4. # 4 楼答案

    在测试1中。java,当您将Helloobjecth传递给build()方法时,变量main().hbuild().h指向内存中的同一个对象

    main().h = build().h => pointing same object

    但是在测试2中。java,即使您将main().h传递给build()方法,但稍后在build方法内部,您将build().h重新初始化到一个新对象。但这并不影响main().h

    它们都指向不同的物体

    这就是为什么main().h仍然包含null并且您的程序打印为true

  5. # 5 楼答案

    你有两个不同的变量h。第一个是main本地的。第二个是build本地的

    如果将build变量重命名为x,那么main中的h不受影响的原因就显而易见了

    编辑:

    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 x){
            x = new Hello();
        }
    }
    

    在这里你可以清楚地看到,xnull开头。然后x成为一个新对象。然后x死亡hx的生活一无所知