在什么情况下应该使用这种方式:
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
是final,我想用第一种方式怎么办?
关于第一种方式,我是这样理解的:我们clone父类(super class)向上转型,导致一些成员未初始化。在此之后初始化这些成员。我的理解正确吗?
谢谢。
最佳答案
两件事:
1)第一种形式,不需要浅拷贝数据成员(clone.x=this.x)。 Object.clone() 为您完成。
2) 使用第二种形式时要小心:它总是创建一个具体类型 A 的实例,因此如果您用 B 扩展 A,那么 B.clone() 将无法再使用其父类(super class)的克隆方法。
--编辑--
关于您的问题,如果方法 clone() 在类 X 的层次结构中被正确实现,那么在类 X 的实现中调用 super.clone() 将返回类型为 X 的实例.从 Object 继承的默认 clone() 是一个“魔术方法”,因为它创建了调用它的具体类的实例。它还执行所有数据成员的浅拷贝。通常,在 clone() 的实现中,您会执行一些深度复制,以避免在源和克隆之间共享可变对象的引用。
关于java - 在 Java 中实现可克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2710269/