我知道使用这种克隆机制不是一个好主意(因为它像一些作者所说的那样被“破坏”了),尽管我需要帮助来理解它是如何工作的。我们得到以下类层次结构:
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
extends Object
,怎么super.clone()
返回一个实例N
呢?super.clone()
实际上Object.clone()
是返回对 class 对象的引用Object
。为什么我们能够将其转换为N
?N
有一个num
不在类中的成员Object
。默认行为实际上如何设法自动克隆此变量(因为它在 class 中没有记录Object
)?
此外,M 也是如此。M.clone()
我们将一个对象从 class N
(由 返回super.clone()
)转换为 class 的对象M
。我知道所有这些都是有效的,但我不明白为什么。