我应该在哪种情况下使用这种方式:
public A clone() throws CloneNotSupportedException {
A clone = (A)super.clone();
clone.x= this.x;
return clone;
}
在哪种情况下我应该使用这种方式:
public ShiftedStack clone() throws CloneNotSupportedException {
return new A(this.x);
}
如果x
是最终版并且我想使用第一种方式,我该怎么办?
关于第一种方式,我理解为这样:我们克隆超级类并上传它,导致一些成员未初始化。在此之后初始化这些成员。我的理解是否正确?
谢谢。
答案 0 :(得分:4)
两件事:
1)在第一种形式中,不需要浅拷贝数据成员(clone.x = this.x)。 Object.clone()为你做到了。
2)使用第二种形式时要小心:它总是创建一个具体类型A的实例,因此如果你用B扩展A,那么B.clone()就不能再使用它的超类'clone方法了。
- 编辑 -
关于你的问题,如果方法clone()在类X的层次结构中正确实现,那么在类X的实现中调用super.clone()将返回类型 X 的实例。从Object继承的默认clone()是一种“魔术方法”,因为它创建了一个具体类的实例。它还执行所有数据成员的浅表副本。通常,在clone()的实现中,您执行一些深度复制,以避免源和克隆之间的可变对象的共享引用。
答案 1 :(得分:-2)
第一种方法不起作用。您不能upcast父类的克隆。它将是父类的一个实例。
A clone = (A)super.clone(); // can't do this