Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当我使用实例方法返回另一个对象时,为什么要修改当前对象JAVA_Java_Object_Instance - Fatal编程技术网

当我使用实例方法返回另一个对象时,为什么要修改当前对象JAVA

当我使用实例方法返回另一个对象时,为什么要修改当前对象JAVA,java,object,instance,Java,Object,Instance,我上这门课,我不明白到底发生了什么: public class Table { private int[][] array; private int N; // constructor public Table(int[][] array) { N = array.length; this.array = Arrays.copyOf(array, N); } // this method returns anot

我上这门课,我不明白到底发生了什么:

public class Table {
    private int[][] array;
    private int N;

    // constructor
    public Table(int[][] array) {
        N = array.length;
        this.array = Arrays.copyOf(array, N);
    }

    // this method returns another Table object
    public Table tweak() {
        int[][] tweak = Arrays.copyOf(array, N);
        // here I change the array
        return new Table(tweak);
    }
}
问题是,当我调用tweak方法时,用于调用该方法的对象也会更改:

public class TestCls {
    public static void main(String[] args) {
        int[][] array = {{1, 2}, 
                         {3, 4}};
        Table a = new Table(array);
        System.out.println(a.toString());
        /* this will print
        *  1  2 
        *  3  4
        */

        Table b = a.tweak();
        System.out.println(b.toString());
        /* this will print
        *  2  1 
        *  3  4
        */

        System.out.println(a.toString());
        /* this will also print
        *  2  1 
        *  3  4
        */
    }
}
请帮助我理解为什么会发生这种情况,以及我应该如何更改调整方法,以便不更改原始对象


谢谢

问题在于
构造函数对数组进行了修改


请参见
数组。copyOf
正在创建一个新的
int[][]
,但这需要一个浅拷贝-它相当于:

int[][] tweak = new int[array.length][];
for (int i = 0; i < tweak.length; i++) {
    tweak[i] = array[i];
}
int[]tweak=newint[array.length][];
for(int i=0;i
因此,当您拥有一个新的“顶级”阵列时,每个“子阵列”都是共享的。您确实想制作阵列的深度副本:

int[][] tweak = new int[array.length][];
for (int i = 0; i < tweak.length; i++) {
    tweak[i] = array[i].clone(); // Simpler way of performing a shallow copy
}
int[]tweak=newint[array.length][];
for(int i=0;i
这是对每个“子数组”执行一个浅拷贝,但这很好,因为元素类型只是
int
(没有办法使其“更深”)

请注意,您只需要在
tweak
方法或构造函数中执行此操作。复印两份没有意义