为什么要在Java中覆盖clone方法

Ana*_*and 13 java clone

关于在我想要克隆对象的类中重写克隆方法,我很困惑.

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

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

另外,我在某些地方读过覆盖克隆对象并将其公开.我想知道,为什么会这样?

欢迎所有答案.

Roh*_*ain 12

由于Java中的每个类都从Object扩展,因此它应该具有克隆方法,但我们仍然被迫覆盖克隆

不,你不会被迫覆盖该clone方法.在继承中,当您继承一个类时,您不必强制覆盖它的方法.它的修饰语是公共的或受保护的并没有多大区别.但是,如果要直接在super类引用上调用方法,则必须使用该方法public.受保护的方法只能通过继承访问.那是你只能通过subclass参考访问它们.或者,如果您覆盖该方法,则可以通过super关键字访问它们.

话虽如此,你不应该覆盖clone方法,因为它是broken.因为,对于要克隆的类,您需要实现该Cloneable接口.然后你的类使用类的clone方法Object代替.因为,Cloneable界面并不完全有任何方法cloning.这将是一个更好的选择Copy Constructor.

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

   public A(A a) {
      this.data = a.data;
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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


duf*_*ymo 5

我建议阅读Joshua Bloch的Effective Java第2版​​.它有一个讨论克隆的好章节.

我不建议这样做.我认为这是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.
}
Run Code Online (Sandbox Code Playgroud)