为什么对v,w的赋值表现不同?

时间:2016-01-31 17:39:57

标签: java shallow-copy

我希望在v和输出701 801上有一个浅的副本,但我看到700 801.我看不出一个好的解释。如果w是浅拷贝,为什么不v?整数是否指定了整数“rebo​​x”?

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 个答案:

答案 0 :(得分:1)

d2.v = 701;取代了整个Integer

您的浅拷贝会复制对Integer所拥有的d1对象的引用,因此d2.v引用了Integer对象本身,而不是d1.v引用}。

另一方面,d2.scal未被替换。因此,d1.scal等于d2.scal,因为它们是完全相同的对象。如果您更改scal.w,则会更改该对象中的值,该值会针对d1.scald2.scal进行更改。同时,覆盖d2.v会更改引用,但不会更改d2.v本身指向的对象,因此不会更改d1.v