次のような 2 つのループで 2D ブール配列の値を設定しようとしています。
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (boolean b : column)
b = true;
しかし、それはうまくいかないようです。すべてのブール値は false のままです。なぜですか?
次のような 2 つのループで 2D ブール配列の値を設定しようとしています。
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (boolean b : column)
b = true;
しかし、それはうまくいかないようです。すべてのブール値は false のままです。なぜですか?
元のオブジェクトは変更されないため、配列内のオブジェクトに新しい値を割り当てることはできません。次のコードはトリックを行います。
boolean[][] frame = new boolean[10][4];
for (boolean[] column : frame)
for (int i = 0; i < column.length; i++)
column[i] = true;
もう少し説明:
配列には、ブール値を指す要素が含まれています。配列の要素の 1 つの値を b ( for (boolean b : column)
)という変数に代入すると、変数b
は、配列内の要素が指すのと同じオブジェクトを指します。次に、変数b
を にポイントしますtrue
。さて、b は true になります。ただし、配列内の要素は依然として同じオブジェクトを指しています。
これではっきりしたことを願っています。画像だと分かりやすいかも…
それ自体ではなくb
、のコピーであるを再割り当てしているためです。Java のプリミティブは、参照ではなく、値によって渡されたりコピーされたりします (または、少なくとも「最もよく考えられている」)。column[i]
column[i]
より正確には、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
}
}
そのコードを理解すれば、あなたの問題が理解できるでしょう。