为什么最后一个语句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);
}
}
答案 0 :(得分:3)
您正在使用对象引用。声明p1 = p
使p1
引用与p
相同的对象。这就是你得到输出1010
的原因:因为你编辑了p1
是一个引用的对象,它与p
引用的对象是同一个对象。
考虑这个例子。在p = p1
之前,p1
引用o2
(黑色箭头)。在声明之后,它引用o1
(红色箭头)。
至于发现这是一个深层还是浅层副本,你可以自己轻松测试。
创建一个包含对象引用的类:让我们说类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。
希望有所帮助。