2D数组值在没有用Java明确声明的情况下发生了变化

时间:2011-03-02 03:52:55

标签: java multidimensional-array

以下改变参数chr并最终匹配“交换的”2D阵列。我无法看到它是如何改变的,因为它不在任何计算的接收端。 调用此方法的方法也有类似的变量,也以类似的方式更改。

private Character[][] moveLeft(Character[][] chr) {
    Character[][] swapped = chr;
    int[] pos = getBlankLocation(chr); //find the blank space

    //location of blank space in 2d array
    int row = pos[0];
    int col = pos[1];
    if (col != 0) {
        Character temp = chr[row][col - 1];
        swapped[row][col - 1] = chr[row][col];            
        swapped[row][col] = temp;

        return swappedChr;
    }
    return null;
}

2 个答案:

答案 0 :(得分:1)

您使swappedchr引用内存中的同一对象。因此,更改另一个将更改另一个,因为它们都引用相同的对象。请注意,对于像int这样的原始值,情况并非如此。

如果您要在swapped中交换值而chr没有效果,则需要复制或复制chr。您可以使用嵌套的for循环复制值,也可以使用其中一种辅助方法。

答案 1 :(得分:1)

这是预期的。 Java是按值传递的,但传递给方法的值是Array对象的内存地址。因此,任务:

Character[][] swapped = chr;

实际上并没有创建新数组。