静态方法中的Helper方法是否覆盖了多个变量?

时间:2017-11-19 02:49:11

标签: java

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方法),但原始也被更改为相同的东西!这是怎么发生的?

2 个答案:

答案 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等基元时的问题,但不能解决可变对象的问题。

相关问题