2013-09-22 59 views
0

爲什麼最後一條語句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); 
    } 
} 
+2

您不能將一個對象分配給另一個對象,因爲「P p」和「P p1」是引用,而不是對象。您只能從一個到另一個分配參考。 –

+0

但是,我間接地將對象賦值給引用,因爲如果我寫P p1,p2; p1 = p2;它會拋出一個錯誤... – Daredevil

+0

您正在爲另一個引用分配一個引用。你得到一個錯誤,因爲你正在分配的引用沒有被初始化。 –

回答

3

您正在使用對象引用。陳述p1 = p使得p1指的是與p相同的對象。這就是爲什麼你得到輸出1010:因爲你編輯p1是一個參考對象,這是一個p是一個參考相同的對象。

考慮這個例子。在p = p1之前p1是指o2(黑色箭頭)。聲明之後,它指的是o1(紅色箭頭)。

Object References

至於找出如果這是一個深或淺拷貝,你可以很容易地測試它自己。 創建一個包含對象引用的類:假設類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 

這意味着它是一個淺拷貝。

+0

我知道,但這是否意味着它是深拷貝? – Daredevil

+0

這不是一個副本,它意味着kid_p1想要kid_p玩具(o1)。這不是玩具複製品,而是另一個玩具。 –

+0

雅我知道了,但問題是當我寫p = p1這種複製類型是這樣的:淺或深?它在採訪中被問到。 – Daredevil

0

在開始時,您有2個對象,我們將它們命名爲o1和o2。 p指向o1,p1到o2。

p1=p;表示p1將指向p指向的對象。所以,p會一直指向o1,但是p1也會指向o1。 (附註:o2有資格在此時進行垃圾回收)。

修改p或p1時,實際上是在修改對象o1。這就是爲什麼p.k=9;replacedp1.k=10;由於它意味着o1.k將保持9和o1.k將保持爲10.

希望有所幫助。

相關問題