19

如果我有:

class foo implements Cloneable

然后做:

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

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

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

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

4

4 回答 4

30

使用克隆时要非常小心。事实上,我会完全避免它。我从来不需要它。但是...话虽如此,我读过的关于该主题的最佳讨论是 Joshua Bloch 在 Effective Java 中的。阅读第 11 项:“明智地覆盖克隆”。

请帮自己一个忙并阅读该项目。我实际上建议阅读整章(以及本书的其余部分)。您需要了解的有关克隆的所有信息以及我为何提醒您注意它的原因都在其中。

希望这可以帮助。

于 2009-07-01T05:39:25.003 回答
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() 方法,它将被调用。

于 2009-07-01T05:20:27.943 回答
1

如果我有:“类 foo 实现可克隆”

然后做: bar = new foo(); bar.clone();

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

这仅在您在“foo”类中调用它时才有效,因为继承自的 .clone() 方法Object是受保护的。

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

(1)Object.clone()确实有一个实现。如果对象实现了Cloneable. (2) 该.clone()方法不是任何接口的一部分。(3) 拥有.clone()方法和实现Cloneable接口是完全不同的事情。Cloneable如果你打算使用Object'clone方法,你只需要实现接口;但是,这是为您的类编写clone方法的推荐方法——从超类的方法中获取其副本,该clone方法最终会上升到Object'sclone方法。

于 2009-07-01T09:44:00.127 回答
1

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

说Object.clone() has no implementation 和 Class Object 本身不实现接口 Cloneable之间是有区别 的

对象的克隆方法确实有实现,它对调用克隆方法的对象进行内存复制。

没错,Object 类没有实现可克隆,它所做的只是检查对象是否可克隆。

上面的答案点是你读一些书,我想我可以给出一个快速的解决方案来回答你的问题

那么我的浅克隆是从哪里来的呢? 对象的克隆方法

Where is the code that implements bar.clone() if Object.clone() has no implementation? it has implementation, written in native code.

于 2018-04-04T08:53:54.747 回答