我知道使用这种克隆机制并不是一个好主意(因为它像一些作者所说的那样“破坏”),尽管我需要帮助理解它是如何工作的。我们给出了以下类层次结构:
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
。默认行为如何实际设法自动克隆此变量(因为它在类Object
中没有它的记录)?
此外,对于M. M.clone()
我们正在将类N
(由super.clone()
返回)中的对象转换为类M
的对象。我知道所有这些都是有效的,但我不明白为什么。
答案 0 :(得分:6)
Object#clone
是一个本机方法,它创建对象的低级二进制副本,从而生成同一个类的另一个实例。因此,向下倾斜是安全的。
请注意,这是唯一的方式,可以使用多态克隆方法。
答案 1 :(得分:2)
从技术上讲,Object.clone()
是一种原生方法:
protected native Object clone() throws CloneNotSupportedException;
JVM在内部知道当前对象的大小,以及对象的类型。因此,它可以创建适当的对象作为按位复制并返回对它的引用。
答案 2 :(得分:0)
答案:
答案 3 :(得分:0)
您还可以使用 XStream 对象来克隆您的对象,如下所示:
public static <T> T cloneObject(
T object) {
XStream xstream = new XStream();
return (T) xstream.fromXML(xstream.toXML(object));
}