Java数组克隆奇怪的行为

时间:2011-11-16 22:02:26

标签: java arrays clone

我正在尝试克隆一个名为CSP的自定义类的实例。我有一个名为csp的实例,我想做一个名为cspclone的csp的克隆。以下是我用来做的事情:

CSP cspclone = new CSP((csp.x).clone(), (csp.d).clone(), (csp.c).clone());

出于某种原因,虽然当我将cspclone传递给修改它的方法时,csp也被修改,就好像我忘记了.clone()函数,但我没有!为什么会这样??

4 个答案:

答案 0 :(得分:3)

覆盖clone中的CSP方法:

public class CSP {
    private String aField;
    private int[] array;
    private int[][] twoDArr;
    private List<ALContent> list; //here ALContent also needs to override clone properly

    @Override
    public Object clone() {
        CSP clone = new CSP();
        clone.aField = this.aField;
        clone.array = new int[this.array.length];
        System.arraycopy(this.array, 0, clone.array, 0, this.array.length);

        clone.list = new ArrayList<ALContent>();
        for(ALContent content : this.list) {
            clone.list.add(content.clone()); //make sure you add the clone of the content
        }

        clone.twoDArr = new int[this.twoDArr.length][];
        for(int i=0; i<this.twoDArr.length; i++) {
            clone.twoDArr[i] = new int[this.twoDArr[i].length];
            System.arraycopy(this.twoDArr[i], 0, clone.twoDArr[i], 0, this.twoDArr[i].length);
        }

        return clone;
    }
}

然后你可以这样做:

CSP csp = new CSP();
CSP cspClone = (CSP) csp.clone();

答案 1 :(得分:0)

如果数组类型的属性使用System.arraycopy

答案 2 :(得分:0)

根据http://download.oracle.com/javase/1.3/docs/api/java/lang/Object.html#clone%28%29

  

此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

您可能必须覆盖克隆方法,并在对象中clone() 引用类型属性(即执行深层复制操作)。

答案 3 :(得分:0)

要解决您的问题,您需要深入克隆。默认克隆方法执行浅表复制。请参阅Object.clone()

以下是一些方法。都有优点和缺点。

以下是克隆的其他几个stackoverflow讨论。