当前位置: 首页 > 知识库问答 >
问题:

为什么在Java中重写克隆方法

封弘伟
2023-03-14

我对在我想要克隆对象的类中重写克隆方法感到困惑。

因为Java中的每个类都是从Object扩展而来的,所以它应该有clone方法,但是我们仍然被迫重写clone。为什么要求?

另外,我在一些地方阅读了重写克隆对象并将其公之于众的内容。我想知道,为什么会这样?

欢迎提供所有答案。

共有1个答案

公西兴业
2023-03-14

因为Java中的每个类都是从Object扩展而来的,所以它应该有clone方法,但我们仍然被迫重写clone

不,您不会被迫重写clone方法。在继承中,当您继承一个类时,您不会被迫重写它的方法。它的修饰符是public还是protected并没有什么不同。但是,如果要直接在super类引用上调用方法,那么该方法必须是public。受保护的方法只能通过继承访问。也就是说,您只能通过子类引用访问它们。或者,如果重写了该方法,则可以通过super关键字访问它们。

话虽如此,您不应该重写clone方法,因为它是broked。因为,对于要克隆的类,需要实现cloneable接口。然后,您的类使用Object类的Clone方法。因为,cloneable接口没有任何用于cloneing的方法。更好的选择是使用copy构造函数

public class A {
   private int data;
   public A() {
   }

   public A(A a) {
      this.data = a.data;
   }
}

要了解更多细节,我建议阅读Joshua Bloch的Effective Java的这一章,它涵盖了使用Clone方法的所有方面。

有效的java-item#11-明智地覆盖克隆

 类似资料:
  • 如果我克隆了以下类的一个实例,并在实例化时覆盖了一个方法,克隆会有被覆盖的方法吗?我在https://docs.oracle.com/javase/7/docs/api/java/lang/Cloneable.html和https://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#clone()中没有找到任何关于这种行为的内容。

  • 问题内容: 对于在要克隆对象的类中重写克隆方法,我感到困惑。 对象类具有 受保护的对象 方法,并且按照受保护的行为,即 当方法受到保护时,只能由类本身,该类的子类或与该类位于同一包中的类访问 。 由于Java中的每个类都从Object扩展而来,因此它应该具有clone方法,但仍然被迫重写clone。为什么需要它? 另外,我在某些地方已经阅读了有关覆盖克隆对象并将其公开的信息。我不知道为什么会这样吗

  • 问题内容: 我需要在我的没有超类的对象中实现一个深层克隆。 处理超类(即)引发的检查的最佳方法是什么? 一位同事建议我按以下方式处理: 对我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。 问题答案: 你绝对必须使用吗?大多数人都同意是坏的。 如果你已经阅读了我书中有关克隆的内容,尤其是你在两行之间阅读的话,你会知道我认为它clon

  • 本文向大家介绍为什么要使用克隆?相关面试题,主要包含被问及为什么要使用克隆?时的应答技巧和注意事项,需要的朋友参考一下 克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。

  • 当我们不知道任何给定对象的finalize()方法何时可以运行时,我们需要在java中重写finalize()方法的哪里?我们可以在finalize()中关闭什么类型的资源?GC调用finalize()方法的最佳机会是什么?

  • 如何用clone()方法克隆Java对象 我有一个关于在java中正确实现类的方法的问题。我知道这是不好的做法,但我需要在考试中知道这一点…在上面的讨论中,他们说调用-但我不明白如果超级函数没有实现克隆会发生什么。例如,假设我有一个扩展Y的类X。X实现了Cl的,而Y没有。Y的方法应该抛出一个异常。那么在这种情况下我们该怎么办? 我能找到的所有解释都以某种方式假设所有超类都实现了克隆,或者至少我是这