假設我有一個名為 House 的類,它有兩個欄位:
- 整數區域
- java.util.Date whenBuild
我想通過覆寫 Object 類中的 clone 方法來使用 clone() 執行這個類的深拷貝:
public Object clone() throws CloneNotSupportedException {
// Perform a shallow copy
House houseClone = (House)super.clone();
// Deep copy on whenBuilt
houseClone.whenBuilt = (java.util.Date)(whenBuilt.clone());
return houseClone;
}
顯然,上面的代碼是應該如何完成的。我不明白的是:寫 whenBuilt.clone() 不做 Date 物件的淺拷貝而不是深拷貝?換句話說,我的 houseClone 的 whenBuilt 欄位不會仍然參考我原來的 House 類及其 whenBuilt 欄位嗎?我的理解是,默認情況下,所有克隆方法都不進行深度復制。我沒有得到什么?
uj5u.com熱心網友回復:
該實體包含兩個值。您需要將這些值從原始實體復制到新實體。它更像是:
public Object clone() throws CloneNotSupportedException {
// Perform a shallow copy
House houseClone = (House)super.clone();
// Deep copy on whenBuilt and area
houseClone.whenBuilt = (java.util.Date)(this.whenBuilt.clone());
houseClone.area = this.area;
return houseClone;
}
我們知道日期是一個非常簡單的物件,您可以使用舊日期的時間值構造一個新日期,但是如果 Date 上的克隆方法有效,那么通常使用它會更合適。
寫 whenBuilt.clone() 不做 Date 物件的淺拷貝而不是深拷貝嗎?
克隆用于進行深度復制。顯然,確切的含義取決于類。它應該給你另一個實體,它具有所有相同的值,但是是一個不同的實體。如果您檢查 Date 類的代碼,您會發現它只包含一個 long 值,因此 Date 類的淺層和深層之間沒有真正的區別。
如果您不對 Date 物件進行克隆,那么兩個 House 物件(原始物件和克隆物件)都將指向相同的 Date 實體。克隆操作將為您提供一個新的 Date 實體,其中包含相同的日期值。Date 物件有 mutator 方法,就像setDate你不希望setDate一個房子改變另一個房子的日期,所以你必須克隆它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/429027.html
上一篇:確定覆寫特定方法的類
