在原语数组中重新赋值不会改变数组



我尝试用2个循环设置2D布尔数组的值,像这样:

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

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

不能给数组中的对象赋新值,因为原始对象不会被改变。下面的代码可以完成这个任务。

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

我希望这是清楚了。图片会更容易理解…

因为您正在重新分配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
      }
}

理解了这些代码,你就能理解你的代码的问题。

相关内容

  • 没有找到相关文章

最新更新