簡體   English   中英

在clone()中我們使用super.clone()然后訪問一個不在super中的變量,怎么來的?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM