2016-01-31 74 views
2

我期望v上的淺拷貝和輸出701 801,但我看到700 801.我看不到一個好的解釋。如果w是淺拷貝,爲什麼不是v?整數是否分配了一個整數「rebo​​x」?爲什麼v,w的賦值行爲有所不同?

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); 
    } 
} 
+2

Java包裝類型* *不可變*。 –

回答

1

d2.v = 701;替換整個Integer

你的淺拷貝複製參考由d1舉行的Integer對象,所以d2.v已經參照Integer對象本身,而不是參考d1.v

另一方面,d2.scal未被替換。因此,d1.scal等於d2.scal,因爲它們是完全相同的對象。如果更改scal.w,它將更改該對象中的值,該值將在d1.scald2.scal之間更改。同時,覆蓋d2.v更改引用,但不會更改由d2.v本身指向的對象,因此不會更改d1.v

相關問題