当=用于将一个对象分配给另一个对象时,会发生复制类型

时间:2013-09-22 09:21:03

标签: java

为什么最后一个语句1010的输出?这是哪种类型的复制?深或浅?

public class P {
    int k;
    public P() {
    }

    public static void main(String[] args) {
        P p = new P();
        P p1 = new P();
        p1.k = 4;
        p.k = 3;
        System.out.println("" + p1.k + p.k);
        p1 = p;
        System.out.println("" + p1.k + p.k);
        p.k = 9;
        p1.k = 10;
        System.out.println("" + p1.k + p.k);
    }
}

2 个答案:

答案 0 :(得分:3)

您正在使用对象引用。声明p1 = p使p1引用与p相同的对象。这就是你得到输出1010的原因:因为你编辑了p1是一个引用的对象,它与p引用的对象是同一个对象。

考虑这个例子。在p = p1之前,p1引用o2(黑色箭头)。在声明之后,它引用o1(红色箭头)。

Object References

至于发现这是一个深层还是浅层副本,你可以自己轻松测试。 创建一个包含对象引用的类:让我们说类A

public class Main {
    public static void main(String[] args) {
        P p = new P(3);
        P p1 = new P(4);
        A a = new A(p);
        A a1 = new A(p1);
        System.out.println("a:  " + a.p.k);
        System.out.println("a1: " + a1.p.k);
        a1 = a;
        System.out.println("a:  " + a.p.k);
        System.out.println("a1: " + a1.p.k);
    }
}

class A {
    public P p;

    public A(P p) {
        this.p = p;
    }
}

class P {
    public int k;

    public P(int k) {
        this.k = k;
    }
}

输出结果为:

a:  3
a1: 4
a:  3
a1: 3

这意味着它是一个浅层副本。

答案 1 :(得分:0)

一开始,你有两个对象,我们将它们命名为o1和o2。 p指向o1,p1指向o2。

p1=p;表示p1将指向p指向的对象。因此,p将继续指向o1,但p1也将指向o1。 (附注:o2此时有资格进行垃圾收集)。

修改p或p1时,实际上是在修改对象o1。这就是p.k=9; replaced p1.k=10;的原因,因为它意味着o1.k将保持9而o1.k将保持10。

希望有所帮助。