2

在哪些情况下我应该使用这种方式:

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是最终的并且我想使用第一种方式,我该怎么办?

关于第一种方式,我的理解是这样的:我们克隆超类并向上转换它,导致一些成员未初始化。在此之后初始化这些成员。我的理解正确吗?

谢谢你。

4

2 回答 2

4

两件事情:

1)第一种形式,不需要浅拷贝数据成员(clone.x=this.x)。Object.clone() 为您完成。

2) 使用第二种形式时要小心:它总是创建一个具体类型 A 的实例,因此如果你用 B 扩展 A,那么 B.clone() 将不能再使用它的超类的 clone 方法。

- 编辑 -

关于您的问题,如果方法 clone() 在类 X 的层次结构中正确实现,则在类 X 的实现中调用 super.clone() 将返回X类型的实例。从 Object 继承的默认 clone() 是一个“魔术方法”,从某种意义上说,它创建了调用它的具体类的实例。它还执行所有数据成员的浅拷贝。通常,在 clone() 的实现中,您会执行一些深度复制,以避免在源和克隆之间共享可变对象的引用。

于 2010-04-25T22:54:44.767 回答
-2

第一种方法行不通。您不能向上转换父类的克隆。这将是父类的一个实例。

A clone = (A)super.clone();   // can't do this
于 2010-04-25T23:03:12.863 回答