[英]In clone() we use super.clone() then access a variable that is not in super, how comes?
在克隆方法的通常實現中,有一些我不理解的東西。 如果你看下面代碼中try塊的第一行,我們調用super.clone(),它將創建超類的實例,並返回對該實例的Object引用。 現在,那個實例不一定包含hireDay,那么我們怎么說copy.hireDay? 確實它會編譯正常,但如果實例不包含hireDay,它不應該崩潰嗎?
public Object clone() {
try {
Employee copy = (Employee) super.clone(); // copy ID, name, and salary!
copy.hireDay = (Date) hireDay.clone();
return copy;
} catch (CloneNotSupportedException e) {
System.out.println(e);
return null;
}
}
clone()
是基類Object
中的一種特殊方法,它創建正確基類類型的新實例並復制所有字段(並避免使用任何構造函數)。 因此,如果您沒有未委托給Object.clone()
的自定義父類,您將始終返回當前類型。
作為一個方面說明,在你的榜樣,如果super.clone()
沒有返回的Employee
,那么你的代碼會拋出ClassCastException異常之前,你甚至得在那里你參考步驟hireDay
。
clone
的契約是實現與構造函數相同的調用模式:第一步始終是調用超類實現。 這會導致首先調用Object.clone
,並且所有子類都使用該方法返回的實例。
Object.clone
將返回與正在克隆的類相同的類的實例。 這通過extralinguistic魔術發生,基本上是通過內存塊的按位副本+對副本的必要更改。
克隆機制很脆弱,因為祖先鏈中任何不合規的類都會破壞其所有后代的克隆。 這是為什么這種機制不受歡迎的幾個原因之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.