2013-03-09 11 views
25

最終変数とコンパイル時定数の違いは何ですか?最終変数とコンパイル時定数の差

これは何を意味するのでしょうか?次のコード

final int a = 5; 
final int b; 
b=6; 
int x=0; 
switch(x) 
{ 
    case a: //no error 
    case b: //compiler error 
} 

を考えてみましょうか最終的な変数はいつ、どのように値が割り当てられますか?実行時にはどうなり、コンパイル時にはどうなるでしょうか?スイッチにコンパイル時定数を与えなければならないのはなぜですか? javaの他の構造体はコンパイル時定数を要求しますか?

+0

JLSのトピックのこの特定の部分へのリンクを参照してください –

答えて

26

問題は、すべてcase:ステートメントはコンパイル時にでなければなりません。 最初の文は最終的にです。 aは100%は5以外の値ではありません。

final int a = 5; 

しかし、これはbためを保証するものではありません。 bの周りにif文がある場合はどうなりますか?

final int b; 
if(something()) 
    b=6; 
else 
    b=5; 
2

switchステートメントには定数が必要です。最終変数が初期化されるのを遅らせることができ、コンパイラはcaseブランチに値を持つことをbに対して判断できません。

+6

確かに私はまだ私の質問の答えを得ていない –

7

これは何を意味するのでしょうか?

つまり、 'b'はコンパイル時定数式ではなく、JLSではそれが必要です。

とどのように最後の変数に値が割り当てられていますか?代入文または初期化子が実行された正式

、。

実際には、finalがコンパイル時定数を宣言すると、式はコンパイル時に評価され、その値はコードにハードワイヤードされます。実行時に発生し、どのような何

は、コンパイル時にどうなりますか?

上記を参照してください。

なぜ我々は、コンパイル時定数を切り替えて与える必要がありますか?

JLS にはが必要です。

バイトコードコンパイラは、switch文が整形式であることを確認する必要があります。すなわち、スイッチ定数の値が衝突しないようにする。また、JITコンパイラは、スイッチ定数の実際の値に最適化されたコードを生成することができます。

のjavaの他には、どのような構造は、コンパイル時定数を要求?

私の頭の上から、私が考えることはできません。

3

コンパイラの観点からは、が初期化されない可能性がある変数bを使用しようとしています。 switchステートメントは、JVMバイトコードテーブルスイッチまたはルックアップスイッチにコンパイルされます。この場合、caseステートメントで使用される値はコンパイル時定数と一意です。

final int a = 4; // compiler is sure a is initialized 
final int b;// variable b is not guranted to be assigned 

この文は最終的にbを初期化しますが、コンパイラはそれを検出できません。

if (a < 4) b= 10; 
if (a >= 4) b = 8 
2

final int b;は一度割り当てることができ、その値は条件によってランタイムに決定されること、わからないです。その理由は、たとえの最終的な変数であっても、コンパイル時間ではありません定数ですが、実行時間定数と大文字と小文字のコンパイル時定数が必要です。

関連する問題