为什么clone()方法保存在Object中?

时间:2011-09-14 06:31:23

标签: java cloneable

如果某个类不是Cloneable,则不能克隆此类的对象。那么为什么clone()保留在Object类而不是Cloneable界面中?

2 个答案:

答案 0 :(得分:2)

这是Java中的设计错误(是的,Java并不完美!)。

最好避免使用Java进行克隆。例如,Josh Bloch在Effective Java中指出,第11项:

  

Cloneable接口用作mixin接口(第18项)   用于宣传他们允许克隆的对象。不幸的是,它   没有达到这个目的。它的主要缺陷是它没有克隆   方法,并且Object的clone方法受到保护。没有,你不能   借助反射(第53项),在一个上调用克隆方法   对象只是因为它实现了Cloneable。即使是反光的   调用可能会失败,因为无法保证对象具有   可访问克隆方法。尽管有这个缺陷和其他,该设施是   广泛使用所以理解它是值得的。

如果希望对象可以克隆,请实现复制构造函数或复制方法。

答案 1 :(得分:0)

  1. Cloneable是一个标记接口,对用户/开发人员来说就像是一个属性,看看该类是否为clonebale。

  2. clone()保存在Object类中,因为在clone()实现中建议你调用super的clone(),这只有在超类具有克隆函数时才会发生,即使它没有标记为可克隆(通过实现Cloneable)因此保持对象中的clone()函数是有意义的。

  3. clone()完全创建了一个类的不同实例,就像构造函数应该调用super的方法来创建一个完整的实例。