如果某個類不是Cloneable
,則不能克隆該類的任何對象。那麼爲什麼clone()
保存在Object
類而不是在Cloneable
界面?爲什麼clone()方法保存在Object中?
回答
Cloneable是一個標記接口,作爲用戶/開發人員的屬性來查看該類是否爲clonebale。因爲在你的clone()實現中,建議你調用super的clone(),這隻有在超類具有一個克隆函數(即使它沒有標記爲clone)時纔會發生(())(clone通過實現Cloneable),因此保持Object中的clone()函數是有意義的。如果構造函數應該調用super的方法來創建一個完整的實例,clone()會創建一個完全不同的類實例。
第2點是錯誤的:類可以*總是*調用'super.clone()',因爲'Object'具有'clone()'。第3點在這裏是不相關的,我沒有看到它是如何將'clone()'保存在'object'中的原因。 –
點2表示,克隆保存在Object中,以便它的任何子類(通過調用super.clone())都可以調用它,即使它沒有標記爲可複製。 點3的相關性是,當我們調用super的構造函數來創建一個實例時,我們也必須對它進行克隆。不是強制性的但強烈建議。 – Satyavrat
這是Java的設計錯誤(是的,Java並不完美!)。
最好避免在Java中克隆。例如喬希布洛赫指出了有效的Java,項目11:
Cloneable接口的目的是作爲一個混合接口(項18) 爲對象,以通告它們允許克隆。不幸的是,它 未能達到此目的。它的主要缺陷是缺少克隆方法,並且Object的克隆方法受到保護。如果沒有 (如果沒有 ),則僅僅因爲它實現了Cloneable而無法調用 對象上的克隆方法。即使反射 調用也可能失敗,因爲不能保證該對象具有可訪問的克隆方法 。儘管存在這個缺陷和其他問題,但該設施的廣泛使用範圍爲 ,因此理解它是值得的。
如果您希望您的對象是可複製的,請實現複製構造函數或複製方法。
- 1. 爲什麼Object類有Thread方法?
- 2. 爲什麼Object [ID]沒有方法'Animate'?
- 3. 爲什麼Object類沒有Thread方法
- 4. 什麼替換了方法clone(Serializable)
- 5. 爲什麼在數組上允許clone方法?
- 6. 爲什麼#clone()不在Cloneable接口中?
- 7. 爲什麼clone()方法無法正常工作?
- 8. 續集:爲什麼不保存保存方法?
- 9. 在jQuery中,爲什麼$ .clone(this)與$(this).clone()相同?
- 10. 爲什麼我在保存方法中得到這個ValidationException?
- 11. 爲什麼Object類方法在接口中可用?
- 12. 爲什麼wait,notify和notifyAll方法在Object Class中?
- 13. 爲什麼在java的Object類中有公共方法?
- 14. gwt:如何編寫一個不會導致「方法clone()未定義爲類型Object」錯誤的clone()方法?
- 15. 爲什麼在同一個包中使用繼承無法訪問受保護的clone()方法
- 16. 在Jackson中將任何對象保存爲通用Map <String,Object>的正確方法是什麼?
- 17. 頂級方法:爲什麼他們成爲Object中的私有實例方法?爲什麼不公開?
- 18. 爲什麼不在內部重寫.clone?
- 19. 我無法在Java的Object類中找到clone()方法的實現。
- 20. 爲什麼數據保存在onSaveInstanceState()方法返回null
- 21. 爲什麼Object []可以存儲基元?
- 22. 什麼是`object`的默認`apply`方法?
- 23. 爲什麼'pop'方法存在?
- 24. 爲什麼調用create類作爲方法不保存記錄?
- 25. 爲什麼Java的Hashtable的get方法將Object作爲參數?
- 26. 爲什麼在main中定義一個方法在Object和main.singleton_class中定義它?
- 27. 爲什麼(Spring 3)HandlerMethodResolver#init()方法在Object類的方法上找到註釋?
- 28. 爲什麼$ _POST變量無法在PHP中保存爲$ _SESSION?
- 29. Object類型的方法clone()不可見。擴展解決它
- 30. 爲什麼NSUserDefaults無法保存NSMutableDictionary?
這可能會離開,但它可能是某種形式的多態性,例如,在一個集合中foreach'Object',試着克隆它,如果成功做了一件事情,如果拋出一個異常做另一件事。 –
[Java:Cloneable接口的基本原理]的可能重複(http://stackoverflow.com/questions/709380/java-rationale-of-the-cloneable-interface) –
閱讀答案[here](http:// stackoverflow.com/questions/1138769/why-is-the-clone-method-protected-in-java-lang-object)或[這裏](http://stackoverflow.com/questions/709380/java-rationale-of -the-cloneable-interface)應該可以幫到你。 –