Java 在原语数组中重新指定数组值不会更改数组

Java 在原语数组中重新指定数组值不会更改数组,java,multidimensional-array,Java,Multidimensional Array,我尝试用2个循环设置2D布尔数组的值,如下所示: boolean[][] frame = new boolean[10][4]; for (boolean[] column : frame) for (boolean b : column) b = true; 但这似乎不起作用,所有布尔值都是假的,为什么?不能为数组中的对象指定新值,因为原始对象不会更改。下面的代码将完成此任务 boolean[][] frame = new boolean[1

我尝试用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;
boolean[]frame=new boolean[10][4];
for(布尔[]列:帧)
for(int i=0;i
再解释一下:

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


我希望这一点现在已经清楚了。图像将使其更易于理解…

因为您正在重新分配
b
,它是
列[i]
的副本,而不是
列[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
      }
}

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

b
是循环中的局部变量。更改它的值不会影响数组内容。即使是(SomeObject b:column),也不会起作用。问题不在于它是一个原语,而是改变变量指向的对象不会改变数组指向的对象。“b.x=2;//a.x现在是2”真的是吗?我认为“a.x现在是2”只适用,如果你在Big_Chair上另外设置“a=b”,这是正确的。引用实际上并不相互指向。每当你阅读
left=right
时,这实际上意味着
left=right的对象
。所以在
b=a
表示
b=a的Foo
,所以当调用
b.x=2
时,它表示
(a的Foo)。x=2
。该死,我应该猜到b只能是一个副本,而不是对象本身,谢谢你的解释