Java数组克隆奇怪的行为
我正在尝试克隆一个名为CSP的自定义类的实例。我有一个名为csp的实例,我想克隆一个名为cspclone的csp。下面是我用来做这件事的方法:Java数组克隆奇怪的行为,java,arrays,clone,Java,Arrays,Clone,我正在尝试克隆一个名为CSP的自定义类的实例。我有一个名为csp的实例,我想克隆一个名为cspclone的csp。下面是我用来做这件事的方法: CSP cspclone=new CSP((CSP.x).clone(),(CSP.d).clone(),(CSP.c).clone()) 由于某种原因,当我将cspclone传递给修改它的方法时,csp也会被修改,就好像我忘记了.clone()函数,但我没有!为什么会这样 如果您的数组类型属性使用如果您的数组类型属性使用覆盖CSP中的克隆方法: pub
CSP cspclone=new CSP((CSP.x).clone(),(CSP.d).clone(),(CSP.c).clone())代码>
由于某种原因,当我将cspclone传递给修改它的方法时,csp也会被修改,就好像我忘记了.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
中的clone
方法:
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;
}
}
据
此方法创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作
您可能必须重写clone方法,并在对象中使用引用类型属性(即,执行深度复制操作)。根据
此方法创建此对象类的新实例,并使用此对象对应字段的内容初始化其所有字段,就像通过赋值一样;字段的内容本身不是克隆的。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作
您可能必须覆盖克隆方法和对象中的引用类型属性(即执行深度复制操作)。要解决问题,您需要深度克隆。默认克隆方法执行浅层复制。看
这里有一些方法。所有这些都有优点和缺点
- 覆盖:覆盖clone()方法
- 序列化:将对象写入流并从流中读回
- 反思:这里有一个例子
- 使用深闭库,例如
下面是关于克隆的其他几个讨论
要解决您的问题,您需要深度克隆。默认克隆方法执行浅层复制。看
这里有一些方法。所有这些都有优点和缺点
- 覆盖:覆盖clone()方法
- 序列化:将对象写入流并从流中读回
- 反思:这里有一个例子
- 使用深闭库,例如
下面是关于克隆的其他几个讨论
.clone()
只执行对象的浅层复制,因此对csp中字段的引用被复制到cspclone中。那么制作真实副本的最简单方法是什么?.clone()
只执行对象的浅层复制,因此,csp中字段的引用被复制到cspclone中。那么,制作真实副本的最简单方法是什么呢?那么,/…
的位置是什么呢?好的,那么我如何为非数组执行此操作呢?以下是CSP对象的字段:public int[]x;公共阵列列表d[];公共int[]c
在ArrayList
中的克隆的默认实现执行浅层复制:。因此,您必须手动执行:。@StickFigs:再次更新了答案。@StickFigs:对于int[]],请检查以下内容:/…
的位置是什么?好的,那么如何对非数组执行此操作?以下是CSP对象的字段:public int[]x;公共阵列列表d[];公共int[]c
在ArrayList
中的克隆的默认实现执行浅层复制:。因此,您必须手动执行:。@StickFigs:再次更新了答案。@StickFigs:对于int[][],请检查以下内容: