Big*_*air 2 java multidimensional-array
我尝试用2个循环设置2D布尔数组的值,如下所示:
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (boolean b : column)
b = true;
Run Code Online (Sandbox Code Playgroud)
但这似乎没有用,所有的布尔都是假的,为什么呢?
您无法为数组中的对象分配新值,因为原始对象不会更改.以下代码将起到作用.
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (int i = 0; i < column.length; i++)
column[i] = true;
Run Code Online (Sandbox Code Playgroud)
更多解释:
该数组包含指向布尔值的元素.将数组中某个元素的值赋给名为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
}
}
Run Code Online (Sandbox Code Playgroud)
理解该代码,您将了解自己的问题。