13

このコードが以下の出力になる理由を誰か説明できますか?

@Test
public void testBooleanArray() {
    Boolean[] ab = new Boolean[]{a, b};

    a = new Boolean(true);
    b = new Boolean(false);

    for(Boolean x : ab) {
        System.out.println(x);
    }
}

結果:

null
null

配列 ab がオブジェクト a とオブジェクト b へのポインターを保持していない場合、次のように出力されます。

true
false
4

5 に答える 5

6

コードが展開されました:

Boolean a = null;
Boolean b = null;
Boolean[] ab = new Boolean[2];
ab[0] = a;
ab[1] = b;

a = new Boolean(true); 
b = new Boolean(false); 

a と b という名前の変数の内容が配列にコピーされた瞬間、 null に設定されました。値によるコピーと参照によるコピー重要な違いがあります。

補足として、不要なオブジェクトの作成を避けるために、代わりに Boolean.TRUE を使用するか、少なくとも Boolean.valueOf(true) を使用することをお勧めします。ブール値にはそれほど多くのオプションはなく、ブール値はimmutableです。

于 2013-10-15T16:43:02.110 に答える
4

配列要素をポインターとして視覚化すると役立つと思います。

最初に 2 つのポインタ と を作成abます。どちらも null を指します。

Boolean a = null, b = null;

ポインター a および b は null を指します

次に、さらに 2 つのポインター と を作成し、ab[0]ととab[1]同じ場所を指します。つまり、.abnull

Boolean[] ab = new Boolean[]{a, b};

4 つのポインタはすべて null を指しています

次に、新しいブール値のtrueandfalseオブジェクトを作成します (ステートメントのnew Boolean(true)andnew Boolean(false)の部分を使用)。

2 つの新しいブール値が作成されました

最後に、それらを指定abます。

a = new Boolean(true);
b = new Boolean(false);

a と b は新しいブール値を指します

このように見ると、なぜ変化abて配列に影響を与えないのかがより明確になると思います。

于 2013-10-16T01:35:48.450 に答える