public class SeamCarving {
public static Seam carve_seam(int[][] disruption_matrix) {
int[][] original = disruption_matrix;
int[][] weighted_matrix = disruption_matrix;
SeamCarving s1 = new SeamCarving();
weighted_matrix = s1.buildMatrix(disruption_matrix);
....
}
在上面的代码中我有一个静态方法carve_seam。该方法采用矩阵。该输入保存在名为original的矩阵变量中。对矩阵执行计算,并且还将其保存为称为weighted_matrix的变量。两者都是必需的。
由于它是在静态方法中,所以创建了一个类的新对象,并从“s1.buildMatrix”中调用它
然而,这条线正在做一些超出我头脑的事情。这是因为之后,不仅weight_matrix被更改(正确地从buildMatrix方法),但原始也被更改为相同的东西!这是怎么发生的?
答案 0 :(得分:0)
这里需要首先理解的是,所有三个引用矩阵都指的是您作为输入传递的相同对象(disruption_matrix对象)。这就是为什么原始和加权矩阵也在被改变的原因。 在第一行,
int[][] original=disruption_matrix;
指disruption_matrix中的同一个对象。
然后在下一行,
int[][] weighted_matrix=disruption_matrix;
也指同一个旧对象。所以,你不需要到达那条线,
weighted_matrix = s1.buildMatrix(disruption_matrix);
看到原始矩阵和加权矩阵都已更改。实际上,当您对disruption_matrix本身进行计算时,它们已被更改。
这种情况非常类似,其中,
int a=10;
int b=a;
int c=a;
因此,不仅'a'而且'b'和'c'将其值分配给10。
以OOP方式,将同一个对象分配给不同的引用,一旦通过单个引用对对象进行了更改,无论您是通过不同的引用访问该对象,该对象都已被改变。
举个例子,让我们来看看这个简单的课程,
Class A{
int val=10;
}
现在,在某种方法中,我们创建一个对象并将其分配给引用,
A a=new A();
a.val=20;
A b=a;
b.val=30;
A c=a;
c.val=40;
对于上面的代码,在名为“a”的引用下创建了一个对象。在下一行中,通过该引用访问值'val',并且已从10更改为20。
然后,引用'b'已被声明并初始化并指向'a'所持有的同一对象。然后在下一行中,该对象(val)的值再次更改为20到30,但这次通过'b'而不是引用'a'。
接下来的三行也是如此,其中对象的值通过引用'c'从30变为40。
那么最后会有什么输出?
System.out.println(a.val);
System.out.println(b.val);
System.out.println(c.val);
显然会给你输出,
40
40
40
这是你在这里缺少的概念(通过值传递并通过引用传递)。
答案 1 :(得分:0)
在Java中,Arrays在技术上是对象而不是基元,即使对于基本类型的数组也是如此。无论何时将参数作为对象传递给方法,Java都会将其作为引用传递给它;原始参数的值会发生变化,因为您创建的所有变量都是"引用"对同一个对象。然而,这不是基元的情况,它是通过值传递的。
我建议每当你需要从另一个矩阵中创建一个矩阵时,你可以使用以下实用程序方法:
public static int[][] copyMatrix(int[][] original) {
int[][] copy = new int[original.length][];
for(int x = 0; x < copy.length; x++) {
copy[x] = new int[original[x].length];
for(int y = 0; y < copy[x].length; y++) {
copy[x][y] = original[x][y];
}
}
return copy;
}
最后,您的代码将如下所示:
public class SeamCarving {
public static Seam carve_seam(int[][] disruption_matrix) {
// no need to make an "original" variable anymore,
// since disruption_matrix already stands for it
int[][] weighted_matrix = copyMatrix(disruption_matrix);
SeamCarving s1 = new SeamCarving();
weighted_matrix = s1.buildMatrix(disruption_matrix);
....
}
}
请记住,此实现复制数组但不复制对象。这将解决您在处理int
等基元时的问题,但不能解决可变对象的问题。