我希望在v和输出701 801上有一个浅的副本,但我看到700 801.我看不出一个好的解释。如果w是浅拷贝,为什么不v?整数是否指定了整数“rebox”?
class Scalar {
Integer w;
public String toString() { return String.valueOf( w ); }
}
public class Demo {
public Integer v;
public Scalar scal;
Demo shallowCopy() {
Demo scopy = new Demo();
scopy.v = this.v; // <- Given this I would 701 from
scopy.scal = this.scal;
return scopy;
}
public String toString() { return String.valueOf(v) + " " + scal.toString(); }
public static void main( String[] args ) {
Demo d1 = new Demo();
d1.v = 700;
d1.scal = new Scalar();
d1.scal.w = 800;
Demo d2 = d1.shallowCopy();
d2.v = 701;
d2.scal.w = 801;
System.out.println( d1 );
}
}
答案 0 :(得分:1)
d2.v = 701;
取代了整个Integer
。
您的浅拷贝会复制对Integer
所拥有的d1
对象的引用,因此d2.v
引用了Integer
对象本身,而不是d1.v
引用}。
另一方面,d2.scal
未被替换。因此,d1.scal
等于d2.scal
,因为它们是完全相同的对象。如果您更改scal.w
,则会更改该对象中的值,该值会针对d1.scal
和d2.scal
进行更改。同时,覆盖d2.v
会更改引用,但不会更改d2.v
本身指向的对象,因此不会更改d1.v
。