当前位置: 首页 > 面试题库 >

为什么要覆盖Java中的克隆方法

壤驷华辉
2023-03-14
问题内容

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

对象类具有 受保护的对象 方法,并且按照受保护的行为,即 当方法受到保护时,只能由类本身,该类的子类或与该类位于同一包中的类访问

由于Java中的每个类都从Object扩展而来,因此它应该具有clone方法,但仍然被迫重写clone。为什么需要它?

另外,我在某些地方已经阅读了有关覆盖克隆对象并将其公开的信息。我不知道为什么会这样吗?

欢迎所有答案。


问题答案:

由于Java中的每个类都从Object扩展而来,因此它应该具有clone方法,但仍然被迫重写clone

不,您没有被迫重写该clone方法。在继承中,当您继承一个类时,您不必强制重写它的方法。其修饰符是公开的或受保护的并没有多大区别。但是,如果要直接在super类引用上调用方法,则该方法必须为public。受保护的方法只能通过继承访问。也就是说,您只能通过subclass引用访问它们。或者,如果您覆盖该方法,则可以通过super关键字访问它们。

话虽如此,您不应该clone按原样重写method
broken。因为,对于要克隆的类,您需要实现Cloneable接口。然后您的班级改用class的clone方法Object。因为,Cloneableinterface确实没有用于的任何方法cloning。改用它会是一个更好的选择Copy Constructor

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

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

有关更多详细信息,我建议您阅读本章“ Joshua Bloch's有效的Java”,其中涵盖了使用clone方法的所有方面。

有效的Java-
项目#11-明智地覆盖克隆



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

  • 问题内容: 我需要在我的没有超类的对象中实现一个深层克隆。 处理超类(即Object)引发的检查的最佳方法是什么? 一位同事建议我按以下方式处理: 对于我来说,这似乎是一个不错的解决方案,但我想将其扔给StackOverflow社区,以查看是否有我可以提供的其他见解。谢谢! 问题答案: 您绝对必须使用吗?大多数人都同意是坏的。 Josh Bloch谈设计-复制构造函数与克隆 如果您已经阅读了我书中

  • 我对在我想要克隆对象的类中重写克隆方法感到困惑。 因为Java中的每个类都是从Object扩展而来的,所以它应该有clone方法,但是我们仍然被迫重写clone。为什么要求? 另外,我在一些地方阅读了重写克隆对象并将其公之于众的内容。我想知道,为什么会这样? 欢迎提供所有答案。

  • 问题内容: 好的,我从很多地方和来源都听说过,每当我覆盖equals()方法时,我也需要覆盖hashCode()方法。但是请考虑以下代码 这里的输出为true,完全按照我想要的方式为false,我根本不关心重写hashCode()方法。这意味着hashCode()覆盖是一种选择,而不是每个人都说的强制性选择。 我想要第二次确认。 问题答案: 它对您有用,因为您的代码未使用任何需要API的功能(Ha

  • 问题内容: 在java中为什么需要覆盖equals和hashcode方法?什么时候用到? 问题答案: 让我们尝试通过一个示例来理解它,如果我们不进行覆盖而覆盖并尝试使用。 假设我们有一个类像这样那样的两个对象是相等的,如果他们等于(和生成) 仅覆盖 如果仅覆盖被覆盖,则在你第一次调用时将散列到某个存储桶,而在调用时将散列到其他存储桶(因为它们具有不同的)。因此,尽管它们是相等的,但由于它们没有散列

  • 问题内容: 为什么无法覆盖静态方法? 如果可能,请使用示例。 问题答案: 覆盖取决于拥有类的实例。多态性的重点是可以对一个类进行子类化,并且实现那些子类的对象对于在超类中定义的相同方法(在子类中被重写)将具有不同的行为。静态方法未与类的任何实例相关联,因此该概念不适用。 影响Java设计的因素有两个。一个是对性能的关注:Smalltalk批评它太慢(垃圾回收和多态调用是其中的一部分),Java的创