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 楼答案
这句话
使减法的“输出”与“输入”的数组相同
你唯一要复制的就是对数据的一个引用
这与语言中对象和引用之间的区别有关。变量只包含引用,而不包含对象
因此
及
在内存中是相同的位置