请澄清以下问题。


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)我不明白你的意思。原语没有被深深地复制。他们没有引用任何内容,因此没有要复制的内容。

10-07 22:32