2009-07-01 98 views
15

可复制的接口和object.clone()如果我有:混淆在Java

class foo implements Cloneable 

然后执行:

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

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

我的理解是,一个接口的功能,必须通过实现它的类被填满,Object.clone()没有执行(按照文档“Object类本身不实现接口Cloneable”)

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

+0

我鼓励你接受一个答案或要求更多的澄清,以便我们能够得到正确的答案:-)。 – Tom 2010-12-29 04:13:57

+0

@Tom sure thing :) – ambertch 2011-01-03 22:51:04

回答

27

非常小心使用克隆。事实上,我会完全避免它。我有从来没有需要它。但是......话说回来,关于我读过的主题的最佳讨论是Joshua Bloch在Effective Java中的讨论。阅读第11项:“明智地重写克隆”。

请自己帮忙,并阅读该项目。我实际上建议阅读整章(以及本书的其余部分)。你需要知道的关于克隆的一切,以及为什么我会告诫你。

希望这会有所帮助。

6

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接口()方法,否则它会抛出CloneNotSupportedException异常。根据定义,Java中的所有类都扩展了Object Object类,而Object类有一个默认的clone()方法,即使Object自身没有实现Cloneable。如果你没有自己覆盖它,Object类的clone()方法将被调用。

+0

啊我明白了。我误读了文档 - 对象有clone()的代码,它只是不实现可复制的 那么为了调用class.clone()而强制实现可复制实现的机制是什么?这只是JRE意识到故意检查的事情吗? – ambertch 2009-07-01 05:38:30

+0

快速回答 - 没有任何。该接口决定了Object的clone()实现的行为。如果一个类是Cloneable,Object.clone()会返回一个副本,否则会抛出CloneNotSupportedException异常。 Cloneable接口本质上修改了其超类的clone()实现的行为。 – Cambium 2009-07-01 05:54:11

1

如果我有: “类Foo实现 可复制的,”

然后执行:巴=新富(); bar.clone();

我得到一个浅拷贝,而无需 编写任何bar.clone()这样的代码我 通常会需要做的,当我 实现一个接口。

如果您在类“富”中调用它,因为从Object继承.clone()方法是受保护这只会工作。

我的理解是,一个 接口的功能的,必须在课堂上充满 实现它,并且 Object.clone()有没有实现 (根据文档,“Object类 本身不实施 接口Cloneable“)

(1)Object.clone()确实有一个实现。如果对象执行Cloneable,它会创建该对象的浅表副本。 (2).clone()方法不是任何接口的一部分。 (3)有一个.clone()方法和实现Cloneable接口是完全分开的东西。如果您打算使用Objectclone方法,则只需实现Cloneable接口;然而,这是为您的班级编写clone方法的推荐方式 - 从超类的clone方法中获取它的副本,最终这种方法最高可达Objectclone方法。