请澄清以下问题。super.clone()
是否执行深层复制或浅层复制?
在下面的示例中,为什么我们不需要类CompositeObjCloneMe
可克隆?尝试克隆cObj
对象时不会克隆CloneMe
吗?
注意:即使将CompositeObjCloneMe
设置为可克隆状态也不会对输出产生任何影响。
为什么由于程序正在设置类的原始值(setCObjValue = 100
),所以输出的行为像浅复制(不是深浅复制)? (原始字段被深深复制)
它是一成不变的吗?
class CloneMe implements Cloneable {
private CompositeObjCloneMe cObj;
public CloneMe() {
cObj = new CompositeObjCloneMe();
}
public void setCObjValue(int myOwnDt) {
this.cObj.setObj(myOwnDt);
}
public int getCObjValue() {
return this.cObj.getObj();
}
//Clone
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class CompositeObjCloneMe {//implements Cloneable{
private int value = 20;
public void setObj(int i){
value = i;
}
public int getObj(){
return value;
}
// public Object clone() throws CloneNotSupportedException{
// return super.clone();
// }
}
public class CloneTest {
public static void main(String arg[]) {
CloneMe realObj = new CloneMe();
try {
CloneMe cloneObj = (CloneMe) realObj.clone();
realObj.setCObjValue(100);
System.out.println(realObj.getCObjValue() + " " + cloneObj.getCObjValue());
} catch (CloneNotSupportedException cnse) {
System.out.println("Cloneable should be implemented. " + cnse);
}
}
}
输出:100100
最佳答案
1)javadoc进行救援:
[...]因此,此方法执行此对象的“浅表复制”,而不是
“深层复制”操作。
2)因为克隆不会递归调用克隆。这是一个浅表克隆。它只是创建一个与原始对象具有相同引用的新对象,并复制原始字段。
3)我不明白你的意思。原语没有被深深地复制。他们没有引用任何内容,因此没有要复制的内容。