2012-05-02 111 views
1

我從Effective Java
閱讀clone它說,在clone被稱爲第一種方法必須是super.clone()
在這種情況下,我想最終我們會最終調用往上走的層次鏈的java.lang.Objectclone
但我認爲對象的克隆沒有做任何事情。
展望代碼中,我看到:
protected native Object clone() throws CloneNotSupportedException;並沒有實現。
但是從段落看來,如果一個類只有原始字段調用
(ClassX) super.clone()是足以創造一個克隆。
但是如何? super.cloneObject超級克隆做什麼?

+0

書中還應該說,這不是一個好主意,用的clone()....你遇到的問題是,你必須依靠正確地實施該方法的超類,否則你會惹上麻煩。要正確地克隆了一個對象,你必須將所有字段(如果文件是原始的,他們顯然不可變的,所以你可以簡單地複製使用=,而不是克隆的參考,對於任何不可變對象)。不要使用克隆,請嘗試複製構造函數或靜態工廠方法。好多了。 – Renato

+2

'Object#clone'是作爲一個本地方法實現的。見http://stackoverflow.com/questions/6825982/how-does-clone-work-under-the-hood –

回答

3

此聲明在對象

protected native Object clone() throws CloneNotSupportedException; 

...意味着該clone方法在本機代碼執行;即在幕後有魔法發生。

您可以放心,Object.clone()實際上確實會做一些事情......只要您宣佈您的班級實施了Cloneable即可。但它所做的不能用普通的Java來表達。

+0

所以它是原始類型的作品?即做類似'memcopy'的東西? – Jim

+0

它有點像memcopy。它會執行低級複製所有字段以及對象頭中的一些隱藏信息。 –

2

克隆()是用於複製的對象以Java的方法。在Java中,對象通過引用變量進行操作,並且沒有用於複製對象的操作符 - 賦值運算符複製引用而不是對象。 clone()方法提供了這個缺失的功能。

1

這是正確的,當你克隆一個對象時,你應該總是調用super.clone()(作爲第一條語句),然後用手克隆對象的其餘部分,這是因爲當你克隆一個對象時,你必須確保對象的超類部分也以正確的方式獲取克隆...

如果對象不支持克隆,它會拋出CloneNotSupportedException,這意味着如果您嘗試克隆超級對象並且出現異常,則可以在您的子類型中也沒有實現克隆對象,並且該對象不能被克隆......有幾種情況禁止對象克隆操作是正確的。