2

次のような 2 つのループで 2D ブール配列の値を設定しようとしています。

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

しかし、それはうまくいかないようです。すべてのブール値は false のままです。なぜですか?

4

2 に答える 2

6

元のオブジェクトは変更されないため、配列内のオブジェクトに新しい値を割り当てることはできません。次のコードはトリックを行います。

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 になります。ただし、配列内の要素は依然として同じオブジェクトを指しています。

これではっきりしたことを願っています。画像だと分かりやすいかも…

于 2013-03-01T15:54:27.357 に答える
5

それ自体ではなく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
      }
}

そのコードを理解すれば、あなたの問題が理解できるでしょう。

于 2013-03-01T15:55:42.380 に答える