Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么clone()方法保留在对象中?_Java_Cloneable - Fatal编程技术网

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
接口中

  • Cloneable是一个标记接口,其作用类似于用户/开发人员查看类是否为clonebale的属性

  • clone()保留在对象类中,因为在clone()实现中,建议您调用super的clone(),只有在该超类具有clone函数时才会发生这种情况,即使其未标记为cloneable(通过实现cloneable),因此将clone()函数保留在对象中是有意义的

  • clone()创建了一个完全不同的类实例,类似于构造函数应该调用super的方法来创建一个完整的实例


  • 这是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调用构造函数。不是强制性的,但强烈建议。