Java 如果超类已经重写了Clone()方法,子类是否需要显式重写它

Java 如果超类已经重写了Clone()方法,子类是否需要显式重写它,java,clone,Java,Clone,如果类A扩展了类B,并且类B已经实现了可克隆接口,那么类A是否需要声明“clone()抛出CloneNotSupportedException” 我想这不应该是强制性的,因为克隆类A对象的属性将自动从类B继承。如果类B定义了非primitve可变成员字段,则有必要重写clone()。这些需要在B.clone()中显式地进行深度复制。如果B仅包含原语和/或不可变数据成员,则A.clone()将执行此任务 有关更详细的解释,请参见类似问题。如果类B定义了非primitve可变成员字段,则有必要重写c

如果类A扩展了类B,并且类B已经实现了可克隆接口,那么类A是否需要声明“clone()抛出CloneNotSupportedException”


我想这不应该是强制性的,因为克隆类A对象的属性将自动从类B继承。

如果类B定义了非primitve可变成员字段,则有必要重写
clone()
。这些需要在
B.clone()
中显式地进行深度复制。如果B仅包含原语和/或不可变数据成员,则
A.clone()
将执行此任务


有关更详细的解释,请参见类似问题。

如果类B定义了非primitve可变成员字段,则有必要重写
clone()
。这些需要在
B.clone()
中显式地进行深度复制。如果B仅包含原语和/或不可变数据成员,则
A.clone()
将执行此任务


有关更详细的解释,请参阅类似问题。

如果父类和所有祖先通过调用其父类的“
Clone
方法实现其
Clone
方法,一直到
Object.Clone
,如果子类添加的字段中没有一个包含对某个对象上应该可以更改而不会影响另一个对象的引用,则可以简单地继承clone而不重写它。如果父类实现了如上所述的克隆方法,但子类添加了自身需要克隆的字段,那么最好的模式是子类调用
base.clone
,然后克隆适当的字段

如果父类或任何祖先未实现其
Clone
方法(如上所述),而是使用复制构造函数,则派生类(及其派生的所有基类)必须重写
Clone
,以执行类似操作,而不管基类是否添加任何新字段


不幸的是,我知道没有很好的方法来确定父类属于哪个类别。如果父类通过调用
base.Clone
来支持
Clone
,那么派生类通过实现复制构造函数来不必要地中断链将是不幸的。另一方面,如果父类实现了
Clone
作为复制构造函数,则不这样做的基类将具有不正确的语义。

如果父类和所有祖先通过调用其父类的
Clone
方法实现其
Clone
方法,一直到
Object.Clone
,如果子类添加的字段中没有一个包含对某个对象上应该可以更改而不会影响另一个对象的引用,则可以简单地继承clone而不重写它。如果父类实现了如上所述的克隆方法,但子类添加了自身需要克隆的字段,那么最好的模式是子类调用
base.clone
,然后克隆适当的字段

如果父类或任何祖先未实现其
Clone
方法(如上所述),而是使用复制构造函数,则派生类(及其派生的所有基类)必须重写
Clone
,以执行类似操作,而不管基类是否添加任何新字段


不幸的是,我知道没有很好的方法来确定父类属于哪个类别。如果父类通过调用
base.Clone
来支持
Clone
,那么派生类通过实现复制构造函数来不必要地中断链将是不幸的。另一方面,如果父类将
Clone
实现为复制构造函数,则不这样做的基类将具有错误的语义。

如果在每个克隆实现中调用super.Clone,则最终将调用Object#Clone。该方法将对所有数据字段进行浅拷贝。我想,OP是对的。@Nikita,我的答案的第一个版本确实不正确,但我已经更新了它,现在我相信它是对的。如果
B
的祖先中有人用复制构造函数而不是
对象来定义
clone
,那么
B
也必须这样做。如果
B
使用复制构造函数,即使其所有祖先链接到
base.clone
,它也会强制其所有后代同样使用复制构造函数。就我个人而言,我觉得克隆方法除了链接到
base.clone
之外做任何事情都令人讨厌,但这种方法非常常见。如果在每个克隆实现中都调用super.clone,那么最终将调用Object#clone。该方法将对所有数据字段进行浅拷贝。我想,OP是对的。@Nikita,我的答案的第一个版本确实不正确,但我已经更新了它,现在我相信它是对的。如果
B
的祖先中有人用复制构造函数而不是
对象来定义
clone
,那么
B
也必须这样做。如果
B
使用复制构造函数,即使其所有祖先链接到
base.clone
,它也会强制其所有后代同样使用复制构造函数。就我个人而言,我觉得克隆方法除了链接到
base.clone
之外,做任何事情都很烦人,但这种方法非常普遍。