我正在尝试克隆一个名为CSP的自定义类的实例。我有一个名为csp的实例,我想做一个名为cspclone的csp的克隆。以下是我用来做的事情:
CSP cspclone = new CSP((csp.x).clone(), (csp.d).clone(), (csp.c).clone());
出于某种原因,虽然当我将cspclone传递给修改它的方法时,csp也被修改,就好像我忘记了.clone()函数,但我没有!为什么会这样??
答案 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讨论。