在基元数组中重新分配数组值不会更改数组

时间:2013-03-01 15:51:42

标签: java multidimensional-array

我尝试使用2个循环设置2D布尔数组的值:

 boolean[][] frame = new boolean[10][4];
    for (boolean[] column : frame)
        for (boolean b : column)
            b = true;

但这似乎不起作用,所有布尔值仍为假,为什么?

2 个答案:

答案 0 :(得分:6)

您无法为数组中的对象指定新值,因为原始对象不会更改。以下代码可以解决问题。

boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
    for (int i = 0; i < column.length; i++)
        column[i] = true;

更多解释:

数组包含指向布尔值的元素。将数组中某个元素的值赋给名为b(for (boolean b : column))的变量时,变量b指向数组中元素指向的同一对象。接下来,将变量b指向true。现在,b将是真的。但是,数组中的元素仍然指向同一个对象。

我希望现在很清楚。图像会让它更容易理解......

答案 1 :(得分:4)

因为您要重新分配b column[i]的副本,而不是column[i]本身的副本。 Java中的原语是(或至少“最好被认为是”)按值传递/复制,而不是通过引用。

更确切地说,Java是引用值的传递,它抛弃了业余“按值传递”/“通过引用传递”二分法。对于原语我不知道“严格说来”它们是否是值,但它们是不可变的,所以在这种情况下没有语义区别。 e.g。

public class Foo {
      public int x;

      public static void main(String args[]) {
            Foo a = new Foo();
            Foo b = a;
            Foo c = new Foo();
            a.x = 1; //b.x is now 1
            b.x = 2; //a.x is now 2
            a = c;
            a.x = 3; //b.x is still 2 because a's reference changed
      }
}

了解该代码,您将了解您的问题。