0

为什么是最后一条语句的输出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);
    }
}
4

2 回答 2

3

您正在使用对象引用。该语句p1 = p使得p1引用与 相同的对象p。这就是您获得输出的原因1010:因为您编辑p1了引用的对象,该对象与引用的对象相同p

考虑这个例子。在p = p1p1o2黑色箭头)之前。声明后,它指的是o1(红色箭头)。

对象引用

至于这是深拷贝还是浅拷贝,你可以自己轻松测试。创建一个包含对象引用的类:假设是 class 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

这意味着它是一个浅拷贝。

于 2013-09-22T09:24:42.743 回答
0

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

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

修改 p 或​​ p1 时,实际上是在修改对象 o1。这就是为什么p.k=9;replacedbyp1.k=10;因为这意味着 o1.k 将持有 9 而 o1.k 将持有 10。

希望有帮助。

于 2013-09-22T09:30:25.857 回答