Java数组克隆奇怪的行为

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的自定义类的实例。我有一个名为csp的实例,我想克隆一个名为cspclone的csp。下面是我用来做这件事的方法:

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[][],请检查以下内容: