为什么要在 Java 中覆盖克隆方法
我对在我想要克隆对象的类中重写克隆方法感到困惑。
对象类具有受保护的对象方法,并且根据受保护的行为,即当方法受到保护时,它只能由类本身,类的子类或与类位于同一包中的类访问。
由于Java中的每个类都从Object扩展而来,因此它应该具有克隆方法,但我们仍然被迫覆盖clone。为什么需要它?
另外,我已经在某些地方阅读了覆盖克隆对象并将其公开的内容。我想知道,为什么会这样?
欢迎所有答案。
我对在我想要克隆对象的类中重写克隆方法感到困惑。
对象类具有受保护的对象方法,并且根据受保护的行为,即当方法受到保护时,它只能由类本身,类的子类或与类位于同一包中的类访问。
由于Java中的每个类都从Object扩展而来,因此它应该具有克隆方法,但我们仍然被迫覆盖clone。为什么需要它?
另外,我已经在某些地方阅读了覆盖克隆对象并将其公开的内容。我想知道,为什么会这样?
欢迎所有答案。
由于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;
}
}
有关更多详细信息,我建议阅读有效Java的这一章,其中涵盖了使用方法的所有方面。Joshua Bloch's
clone
我建议阅读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.
}