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

2022-09-03 06:06:53

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

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

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

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

欢迎所有答案。


答案 1

由于Java中的每个类都是从Object扩展而来的,所以它应该有克隆方法,但我们仍然被迫覆盖克隆

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

话虽如此,您不应该覆盖方法,因为它是 。因为,对于要克隆的类,您需要实现接口。然后你的类使用类的方法代替。因为,接口没有任何方法。使用这将是一个更好的选择。clonebrokenCloneablecloneObjectCloneablecloningCopy Constructor

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

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

有关更多详细信息,我建议阅读有效Java的这一章,其中涵盖了使用方法的所有方面。Joshua Bloch'sclone

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


答案 2

我建议阅读Joshua Bloch的《Effective Java 2nd edition》。它有一个很好的章节讨论克隆。

我不建议这样做。我认为这是一个JDK 1.0错误。这本书将更清楚地说明这一点。

我建议编写一个复制构造函数来获取所需的内容:

public class Foo {
    private String name;
    public Foo(String name) { this.name = name; }
    public Foo(Foo f) { this.name = f.name; }  // copy ctor here.
}