有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使constrator方法非结构化?

我想做一条收缩肌,它的动作就像母体一样。但我很难理解为什么我的constrator中的方法有时是破坏性的(它们会改变传递给它们的值)

下面是一个例子:

这是我的矩阵收缩器的一部分,其中有一种用于逐元素减法的方法:

static class Matrix {
        double[][] data;

        public Matrix subtract(Matrix matrix) {
            Matrix output = new Matrix();

            output.data = this.data;

            if(this.data.length == matrix.data.length && this.data[0].length == matrix.data[0].length){
                for(int i = 0; i < this.data.length; i++)
                    for(int j = 0; j < this.data[0].length; j++)
                        output.data[i][j] = this.data[i][j] - matrix.data[i][j];
            }

            return output;
        }

下面是一些简单的代码,让两个矩阵(A和B)相减,然后将结果放入另一个矩阵(称为C)

        Matrix A = new Matrix();
        Matrix B = new Matrix();

        A.data = new double[][]{ {1,2,3},
                                 {4,5,6}};

        B.data = new double[][]{ {7,8,9},
                                 {10,11,12}};

        System.out.println("Before: ");
        System.out.println("A: " + Arrays.deepToString(A.data));
        System.out.println("B: " + Arrays.deepToString(B.data));

        Matrix C = A.subtract(B);

        System.out.println("After: ");
        System.out.println("A: " + Arrays.deepToString(A.data));
        System.out.println("B: " + Arrays.deepToString(B.data));
        System.out.println("C: " + Arrays.deepToString(C.data));

        

命令行输出如下:

Before: 
A: [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]]
B: [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]
After: 
A: [[-6.0, -6.0, -6.0], [-6.0, -6.0, -6.0]]
B: [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]
C: [[-6.0, -6.0, -6.0], [-6.0, -6.0, -6.0]]

如您所见,矩阵A中的值在执行减法后发生了变化,尽管A的内容从未被过度写入

有人能帮我理解为什么会发生这种情况,以及我如何避免它吗? 谢谢!


共 (1) 个答案

  1. # 1 楼答案

    这句话

            output.data = this.data;
    

    使减法的“输出”与“输入”的数组相同

    你唯一要复制的就是对数据的一个引用

    这与语言中对象和引用之间的区别有关。变量只包含引用,而不包含对象

    因此

            output.data[i][j] 
    

            this.data[i][j] 
    

    在内存中是相同的位置