有關clone()方法
阿新 • • 發佈:2018-12-22
淺拷貝與深拷貝
Cloneable是java重要的一個內建介面,允許實現改介面的類的物件拷貝自己,以產生一個拷貝。clone()方法是Object類的protected方法,一個類對他的類物件域一無所知,所以只能將各個域都進行拷貝,對於數值或者基本型別而言拷貝是不會出現問題的,單如果存在一個子物件,拷貝時則會使得兩個域引用了同一個物件,因此預設的克隆操作是一個淺拷貝,因為它並未克隆內部物件。淺拷貝只有在特定情況下不會造成影響:1.子物件為不可變物件 2.在物件的生命週期中子物件不發生改變。在子物件需要發生改變的情況下需要實現深拷貝。
Cloneable介面的出現與介面的正常使用沒有任何關係,而且它並未指出clone方法,所有的clone方法都是從Object類繼承而來的,它在這裡只是作為一個標記,表明我們知道要進行克隆的處理。一個物件需要克隆但是卻沒有實現Cloneable介面,會產生一個已檢查異常。預設的clone能夠滿足要求的情況下,也是需要實現Cloneable介面的,並重新定義該方法以public修飾,呼叫super.clone(),允許指定正確的返回型別,但是在5以前只能返回Object型別。
深拷貝只需要在方法內部加上對子物件的拷貝即可。
public Employee clone() throws CloneNotSupportException{
Employee cloned = (Employee)super.clone();
cloned.hireDar = (Date) hireDay.clone();
return cloned;
}