【问题标题】:Class attribute variables - are references or a new object stored?类属性变量 - 是引用还是存储了新对象?
【发布时间】:2020-07-14 06:48:39
【问题描述】:

假设我有一个代码:

public static void main(String[] args) {
    Animal r1 = new Animal(10,"Amanda");
    House c = new House(100, r1);
    r1.setAge(3);
    
    House c2 = new House(101, r1);
    System.out.println(c);
    System.out.println(c2);
}

输出是

3 Amanda

3 Amanda

所以看起来 java 所做的就是在 House 的 Animal 字段值中存储对 r1 的引用,以便对对象本身的任何更改都会反映在对 House 类中的 Animal 变量的任何调用中。是这样吗?还是 java 创建了一个全新的对象?

【问题讨论】:

    标签: java pass-by-reference


    【解决方案1】:

    你的假设是正确的。 Java 存储了对r1 所指向的动物的引用。

    请注意,这与传递引用相同。 Java 总是按值传递,但值本身就是引用。

    也就是说,如果你调用House的构造函数,并且在构造函数内部,你给传入的变量赋值一个新的对象,那么这不会反映到外部。

    public House(int id, Animal animal) {
        animal = new Animal(11, "Bertha");
    }
    
    Animal r1 = new Animal(10,"Amanda");
    House c = new House(100, r1);
    System.out.println(r1);
    

    所以上面提到的println 仍然打印“Amanda”(而不是“Bertha”)。传递给构造函数的变量r1 与构造函数中使用的animal 变量不同。 r1引用值复制animal。重新分配 animalr1 没有影响。

    【讨论】:

      【解决方案2】:

      正如您所怀疑的,这两个 House 对象共享对同一个 Animal 对象的引用。

      请注意,此行为仅适用于对象,不适用于基元(int、boolean、float、double、char、...)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-11
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多