为什么对v,w的赋值行为不同?
我希望v上有一个浅拷贝,输出701801,但我看到了700801。我看不出一个好的解释。如果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 );
}
}
# 1 楼答案
d2.v = 701;
替换整个Integer
您的浅层副本复制了对
d1
持有的Integer
对象的引用,因此d2.v
引用的是Integer
对象本身,而不是d1.v
另一方面,
d2.scal
没有被替换。因此,d1.scal
等于d2.scal
,因为它们是完全相同的对象。如果更改scal.w
,它会更改该对象中的值,这将同时更改d1.scal
和d2.scal
。同时,覆盖d2.v
会更改引用,但不会更改d2.v
本身指向的对象,因此不会更改d1.v