如果我有:
class foo implements Cloneable
然后执行:
bar = new foo();
bar.clone();
我得到一个浅拷贝而不需要编写任何bar.clone()
代码,就像我在实现接口时通常需要做的那样。
我的理解是接口的函数必须由实现它的类填充,并且Object.clone()
没有实现(根据文档,“类Object本身不实现接口Cloneable”)
那么我的浅层克隆来自哪里?如果bar.clone()
没有实现,那么实现Object.clone()
的代码在哪里?我很困惑。
答案 0 :(得分:29)
使用克隆非常小心。事实上,我会完全避免它。我从不需要它。但是......话虽如此,我所读过的关于这个主题的最佳讨论是由Joshua Bloch撰写的,在Effective Java中。阅读第11项:“明智地覆盖克隆”。
请自己帮帮忙并阅读该项目。我实际上建议阅读整章(以及本书的其余部分)。你需要知道关于克隆的一切以及我为什么要提醒你的事情都在那里。
希望这有帮助。
答案 1 :(得分:7)
Object.clone()有一个实现:
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone()
此链接说明了Cloneable接口: http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Cloneable.html
对象必须实现Cloneable接口才能调用clone()方法,否则会抛出CloneNotSupportedException。
根据定义,Java中的所有类都扩展了基类Object,而Object类具有默认的clone()方法,即使Object本身没有实现Cloneable。如果你不自己覆盖它,将调用Object类的clone()方法。
答案 2 :(得分:1)
如果我有:“class foo实现 可复制“
然后执行:bar = new foo(); bar.clone();
我得到一份浅薄的副本而不需要 写任何像我这样的bar.clone()代码 我通常需要这样做 实现一个接口。
只有在“foo”类中调用它时才会有效,因为从Object
继承的.clone()方法受到保护。
我的理解是 必须填写接口的功能 在实施它的类中,和 Object.clone()没有实现 (根据文档,“类对象 本身并没有实现 interface Cloneable“)
(1)Object.clone()
确实有实现。如果对象实现Cloneable
,它会生成对象的浅表副本。 (2).clone()
方法不是任何接口的一部分。 (3)使用.clone()
方法并实现Cloneable
接口是完全不同的事情。如果您打算使用Cloneable
的{{1}}方法,则只需要实现Object
界面;但是,这是为您的类编写clone
方法的推荐方法 - 从超类的clone
方法获取其副本,该方法最终会升级到clone
{{1}方法。
答案 3 :(得分:1)
我的理解是接口的函数必须由实现它的类填充,并且Object.clone()没有实现(根据文档,“类Object本身不实现接口Cloneable”)
说 Object.clone()没有实现之间存在差异 而Object类本身并不实现Cloneable接口
Object的clone方法确实有实现,它执行调用clone方法的对象的内存副本。
你是对的,Object类不实现cloneable,它只是检查对象是否可克隆。
以上答案点是你读一些书,我想我可以给出一个快速的解决方案 所以回答你的问题
那么我的浅层克隆来自哪里? 对象的克隆方法
如果Object.clone()没有实现,那么实现bar.clone()的代码在哪里? 它有实现,用本机代码编写。