2012-03-22 90 views
1

我試圖克隆一個對象並更改新克隆對象的成員函數。如果是淺拷貝,並且根據wiki頁面,淺拷貝和原始對象指向同一個對象,則應該更改變量值。對象克隆淺拷貝不會改變變量

CloneExample obj1=new CloneExample(); 
    CloneExample obj2=(CloneExample) obj1.clone(); 
    obj1.a=2; 
    obj1.c='a'; 
    System.out.println("obj1 real "+obj1.a+" "+obj1.c); 
    System.out.println("obj2 real "+obj2.a+" "+obj2.c); 
    obj2.a=99; 
    obj2.c='z'; 
    System.out.println("obj2 after change "+obj2.a+" "+obj2.c); 
    System.out.println("obj1 after change "+obj1.a+" "+obj1.c); 
    System.out.println("obj1="+obj1+" obj2="+obj2); 

如果這個克隆是淺拷貝,然後OBJ2和OBJ1指向相同的參考OBJ,改變OBJ2應OBJ1反映。它不會發生。任何人都可以解釋(我明白克隆旨在給​​我們對象的副本,但如果它是淺拷貝,那麼爲什麼我們需要淺拷貝?我們應該總是去深拷貝)。 謝謝。

回答

0

當你調用object.clone(),將創建新的對象。因此,您可以參考此對象。只有原始類型字段的對象完全克隆。因此,您可以從obj1副本中獲得完全獨立。但是如果你的對象有引用的字段,你需要做一個深層次的克隆。

+1

您只需要深入克隆指向可變對象的引用字段即可。例如,一個字符串字段是一個引用,但不需要深入克隆。 – 2012-03-22 21:11:19

3

爲什麼你認爲克隆是一個淺拷貝?看到這裏:http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#clone()

正如它所說 - 什麼克隆做是依賴於實現。此外,「淺拷貝」不會簡單地創建對同一對象的新引用 - 通常這意味着使用與從中複製的對象相同的內部成員創建新實例。但是,如果您更改新obj的成員變量以指向新的東西,則不會更改原始obj的成員變量。

3

obj1的淺拷貝爲您的CloneExample類(obj1!= obj2)創建另一個實例 obj2。 他們不共享價值成員。

但是,如果我們的類包含引用類型,例如java.util.Date,然後改變它的值將在兩個物體反射如果它們共享參照該java.util.Date

In Java, what is a shallow copy?

+1

'java.lang.Integer'是一個不好的例子,因爲它是不可變的。以'java.util.Date'爲例。 – madth3 2012-03-22 20:39:46

+0

@ madth3你說得對,謝謝指出! – surfen 2012-03-22 20:46:54