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

2022-09-02 12:09:08

如果我有:

class foo implements Cloneable

然后执行:

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

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

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

那么我的浅克隆从何而来?实现 if 的代码在哪里没有实现?我很困惑。bar.clone()Object.clone()


答案 1

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

请帮自己一个忙,阅读该项目。我实际上建议阅读整章(以及本书的其余部分)。您需要了解的有关克隆的所有信息以及为什么我警告您它就在那里。

希望这有帮助。


答案 2

Object.clone() 有一个实现:

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Object.html#clone()

此链接介绍了可克隆接口: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() 方法,则将调用它。


推荐