2

我尝试使用 2 个循环设置 2D 布尔数组的值,如下所示:

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

但这似乎不起作用,所有布尔值都保持错误,为什么?

4

2 回答 2

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 将是真的。但是,数组中的元素仍然指向同一个对象。

我希望这现在很清楚。一张图会让你更容易理解...

于 2013-03-01T15:54:27.357 回答
5

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

更准确地说,Java 是按值传递的引用,它抛弃了业余的“按值传递”/“按引用传递”二分法。对于原语,我不知道“严格来说”它们是否按值计算,但它们是不可变的,因此在这种情况下没有语义区别。例如

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
      }
}

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

于 2013-03-01T15:55:42.380 回答