我知道使用这种克隆机制并不是一个好主意(因为一些作者认为它是“有缺陷的”),尽管如此,我需要帮助理解它是怎么工作的。我们有以下类层次结构:
class N implements Cloneable{
protected int num;
public N clone() throws CloneNotSupportedException{
return (N)super.clone();
}
}
class M extends N{
protected String str;
public M clone() throws CloneNotSupportedException{
M obj = (M)super.clone();
obj.setString(new String(this.str));
return obj;
}
void setString(String str){
this.str = str;
}
}
N
继承自Object
,那么super.clone()
如何返回N
类的实例?实际上,super.clone()
是Object.clone()
,它返回一个指向Object
类对象的引用。我们为什么能将其强制转换为N
类?N
有一个成员变量num
,但在Object
类中没有记录它,那么默认行为是如何自动克隆这个变量的呢?同样的问题也出现在
M
类中。在M.clone()
中,我们将从super.clone()
返回的N
类对象转换为M
类对象。我知道这些都是有效的,但我不明白为什么。