Java 在原语数组中重新指定数组值不会更改数组
我尝试用2个循环设置2D布尔数组的值,如下所示: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
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只能是一个副本,而不是对象本身,谢谢你的解释