关于java中的可克隆接口和object.clone()的困惑

时间:2009-07-01 05:17:37

标签: java cloneable

如果我有:

class foo implements Cloneable

然后执行:

bar = new foo();
bar.clone();

我得到一个浅拷贝而不需要编写任何bar.clone()代码,就像我在实现接口时通常需要做的那样。

我的理解是接口的函数必须由实现它的类填充,并且Object.clone()没有实现(根据文档,“类Object本身不实现接口Cloneable”)

那么我的浅层克隆来自哪里?如果bar.clone()没有实现,那么实现Object.clone()的代码在哪里?我很困惑。

4 个答案:

答案 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()的代码在哪里?  它有实现,用本机代码编写。