我从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 –