我從Effective Java
閱讀clone
它說,在clone
被稱爲第一種方法必須是super.clone()
在這種情況下,我想最終我們會最終調用往上走的層次鏈的java.lang.Object
的clone
。
但我認爲對象的克隆沒有做任何事情。
展望代碼中,我看到:
protected native Object clone() throws CloneNotSupportedException;
並沒有實現。
但是從段落看來,如果一個類只有原始字段調用
(ClassX) super.clone()
是足以創造一個克隆。
但是如何? super.clone
是Object
。超級克隆做什麼?
超級克隆做什麼?
回答
此聲明在對象
protected native Object clone() throws CloneNotSupportedException;
...意味着該clone
方法在本機代碼執行;即在幕後有魔法發生。
您可以放心,Object.clone()
實際上確實會做一些事情......只要您宣佈您的班級實施了Cloneable
即可。但它所做的不能用普通的Java來表達。
所以它是原始類型的作品?即做類似'memcopy'的東西? – Jim
它有點像memcopy。它會執行低級複製所有字段以及對象頭中的一些隱藏信息。 –
克隆()是用於複製的對象以Java的方法。在Java中,對象通過引用變量進行操作,並且沒有用於複製對象的操作符 - 賦值運算符複製引用而不是對象。 clone()方法提供了這個缺失的功能。
這是正確的,當你克隆一個對象時,你應該總是調用super.clone()
(作爲第一條語句),然後用手克隆對象的其餘部分,這是因爲當你克隆一個對象時,你必須確保對象的超類部分也以正確的方式獲取克隆...
如果對象不支持克隆,它會拋出CloneNotSupportedException
,這意味着如果您嘗試克隆超級對象並且出現異常,則可以在您的子類型中也沒有實現克隆對象,並且該對象不能被克隆......有幾種情況禁止對象克隆操作是正確的。
- 1. 從git克隆回購後做什麼
- 2. 爲什麼使用克隆()?
- 3. jQuery Loop?克隆?爲什麼?
- 4. 爲什麼PHP類克隆
- 5. 如果你不用Java進行克隆,那麼你做什麼,你叫什麼?
- 6. 什麼時候Perl 6數組克隆不是克隆?
- 7. 爲什麼混帳克隆--recursive克隆分離子模塊
- 8. heroku - 克隆 - 操作超時
- 9. Java只克隆超類
- 10. Git克隆連接超時
- 11. 我需要做什麼來製作github repo的克隆
- 12. 爲什麼我的git克隆請求超時?
- 13. Git的多級克隆?
- 14. jQuery克隆:它應該克隆DOM級別0事件嗎?
- 15. 爲什麼克隆MS-Access記錄集?
- 16. jquery克隆多個實例爲什麼
- 17. 爲什麼克隆不起作用?
- 18. 什麼是數據庫克隆?
- 19. 什麼是克隆對象的instanceof?
- 20. 什麼是克隆的實際用法
- 21. 我git克隆,現在什麼?
- 22. 爲什麼「混帳克隆」試圖
- 23. 爲什麼Java枚舉不可克隆?
- 24. 什麼是'線程限制'克隆?
- 25. 複製和克隆有什麼區別?
- 26. 什麼是淺克隆的限制
- 27. 克隆行不克隆TR
- 28. 克隆或不克隆
- 29. jQuery的克隆不克隆
- 30. 克隆遠程分支導致克隆所有遠程分支...爲什麼?
書中還應該說,這不是一個好主意,用的clone()....你遇到的問題是,你必須依靠正確地實施該方法的超類,否則你會惹上麻煩。要正確地克隆了一個對象,你必須將所有字段(如果文件是原始的,他們顯然不可變的,所以你可以簡單地複製使用=,而不是克隆的參考,對於任何不可變對象)。不要使用克隆,請嘗試複製構造函數或靜態工廠方法。好多了。 – Renato
'Object#clone'是作爲一個本地方法實現的。見http://stackoverflow.com/questions/6825982/how-does-clone-work-under-the-hood –