Java 为什么clone()方法保留在对象中?
如果类不可克隆,则不能克隆此类的对象。那么为什么Java 为什么clone()方法保留在对象中?,java,cloneable,Java,Cloneable,如果类不可克隆,则不能克隆此类的对象。那么为什么clone()保存在Object类中而不是Cloneable接口中 Cloneable是一个标记接口,其作用类似于用户/开发人员查看类是否为clonebale的属性 clone()保留在对象类中,因为在clone()实现中,建议您调用super的clone(),只有在该超类具有clone函数时才会发生这种情况,即使其未标记为cloneable(通过实现cloneable),因此将clone()函数保留在对象中是有意义的 clone()创建了一个完全
clone()
保存在Object
类中而不是Cloneable
接口中
这是Java中的一个设计错误(是的,Java并不完美!) 最好避免在Java中进行克隆。例如,Josh Bloch在《有效Java》第11项中指出: 可克隆接口旨在作为mixin接口(第18项) 用于发布允许克隆的对象。不幸的是,它 没有达到这个目的。它的主要缺陷是缺少克隆 方法,并且对象的克隆方法受到保护。你不能,没有 借助反射(第53项),在 对象,仅仅因为它实现了可克隆性。甚至是一个反省的人 调用可能会失败,因为无法保证对象具有 可访问的克隆方法。尽管存在这一缺陷和其他缺陷,但该设施仍然存在 广泛使用,因此理解它是值得的
如果希望对象可克隆,请实现一个复制构造函数或复制方法。这可能有点离题,但可能是因为某种形式的多态性,例如,在集合中的foreach
对象,尝试克隆它,如果成功,请做一件事,如果它抛出了一个异常,请做另一件事。可能重复阅读答案,或者应该对您有所帮助。@Joachin和e-MEE这些答案一点帮助都没有。他们说Cloneable
是“坏的”,但没有解释OP所问的问题(即:“为什么clone()方法保存在Object中?”)@NullUserException,在每一位中。在首次引入对象之后从对象
中删除克隆
,将破坏Sun bug数据库条目的向后兼容性。答案就落在Java历史的某个领域,在该领域中,我们做出了一个决定,并且不能为了我们的孩子而改变。第2点是错误的:一个类总是可以调用super.clone()
,因为Object
具有clone()
。第3点与此无关,我不认为这是将clone()
保留在object
中的原因。第2点说,clone保留在object中,以便其任何子类(通过调用super.clone())都可以调用它,即使它没有标记为cloneable。第3点的相关性在于,当我们调用super的构造函数来创建实例时,我们也必须为clone调用构造函数。不是强制性的,但强烈建议。