2010-04-25 84 views
2

在哪些情況下我應該用這樣的方式:實現可克隆在Java中

public A clone() throws CloneNotSupportedException { 
    A clone = (A)super.clone(); 
    clone.x= this.x; 
    return clone; 
} 

而且在什麼情況下我應該用這種方式:

public ShiftedStack clone() throws CloneNotSupportedException { 
    return new A(this.x); 
} 

如果x是最終的,應該怎麼辦,我想用第一種方式?

關於第一種方式,我理解如下:我們克隆超類並向上推它,導致一些成員未初始化。在這之後初始化這些成員。我的理解是否正確?

謝謝。

+2

'cloneable()'被認爲是有害的。可能會對肝臟和幼兒造成傷害。避免。 – skaffman 2010-04-25 22:55:12

回答

4

兩件事情:

1)在第一種形式,沒有必要淺拷貝數據成員(clone.x = this.x)。 Object.clone()爲你做。

2)使用第二種形式時要小心:它始終會具體類型的實例,因此,如果您擴展與B,然後B.clone()將不能再使用它的超類的clone方法。

- 編輯 -

關於你的問題,如果該方法的clone()是正確實施了X級的層次,然後調用super.clone()類X的實現將返回一個實例類型X。從Object繼承的默認clone()是一個「魔術方法」,就是說它創建了一個具體類的實例。它還執行所有數據成員的淺表副本。通常,在執行clone()時,您需要執行一些深層複製,以避免源和克隆之間的可變對象的共享引用。

-2

第一種方法不起作用。你不能上傳父類的克隆。這將是父類的一個實例。

A clone = (A)super.clone(); // can't do this 
+0

@objects:試試吧...... :) – 2010-04-25 23:13:34

+1

這是不正確的。從'Object#clone()'的文檔中,按照慣例,應該通過調用super.clone獲得返回的對象。如果一個類及其所有超類(Object除外)遵守這個約定,那麼x.clone()。getClass()== x.getClass()。 – 2010-04-25 23:13:56