12

このコードスニペットについて考えてみましょう。

public static void main(String[] args) {
    int z1 = 0;
    final int z2 = 0;
    System.out.println(false ? z1 : 'X');
    System.out.println(false ? z2 : 'X');
}

このコードを実行するとX、コンソールに2つ表示されると思います。ただし、実際の出力は次のとおりです。

88
X

三項演算子に関するJavaの仕様を見ると、次のことがわかりました。

オペランドの1つがT型であり、Tがbyte、short、またはcharであり、もう1つのオペランドがint型の定数式であり、その値がT型で表現可能である場合、条件式の型はTです。

したがって、最初の出力では'X'charがと見なされるためint、が出力されます88

finalただし、を使用すると2番目の出力の動作が変わる理由がわかりません。

4

1 に答える 1

9

2 番目のケースでは、 type の final 変数であるため、定数式z2としてカウントされます。int

セクション 4.12.4から:

final でコンパイル時の定数式 (§15.28) で初期化される、プリミティブ型または String 型の変数を定数変数と呼びます。変数が定数変数であるかどうかは、クラスの初期化 (§12.4.1)、バイナリ互換性 (§13.1、§13.4.9)、および明確な代入 (§16) に関して意味を持つ場合があります。

セクション 15.28には、定数式を形成するために使用できる一連の項目に「定数変数」が含まれています。

z1は最終変数ではないため(他に値を割り当てるものはありませんが)、定数変数ではなく、定数式でもありません。仕様から引用した段落は適用されません。

于 2011-01-17T09:10:35.053 に答える