5

コンパイルすると:

public static final boolean FOO = false;
public static final void fooTest() {
    if (FOO) {
        System.out.println("gg");
    }
}

空のメソッドを取得しますfooTest() {}。ただし、コンパイルすると:

static boolean isBar = false;
public static final boolean BAR = isBar;
public static final void fooTest() {
    if (BAR) {
        System.out.println("gg");
    }
}

if ステートメントは、コンパイルされたクラス ファイルに含まれています。これは、Java の static final に 2 つの異なる「タイプ」があることを意味しますか、それともコンパイラの最適化だけですか?

4

4 に答える 4

2

これは、直接代入を無視し、リテラルの間接代入を考慮する純粋なコンパイラ最適化のケースです。

于 2013-07-26T15:34:32.317 に答える
0

メモリ内に存在する静的値は 1 つだけです。最初のブロックでは、静的な最終変数FOOが false 値に設定されます。これはコンパイラに認識されているため、その中の if ステートメントを最適化します。しかし、2 番目のステートメントでは、BAR最終的な静的変数にisBar静的変数値が割り当てられます。これにより、コンパイラーは if ステートメントを最適化しなくなります (任意のブール値である可能性があり、Javaが変数に動的に割り当てられてisBarいるため、ブール値を決定できないため) polymorphism)、したがって、2 番目のブロックの静的変数のメモリ位置は、コンパイラがその値を決定するために重要です。最初のブロックと同様に、値 false は、異なる変数間の割り当てなしで認識され、最適化されます。

于 2013-07-26T15:41:51.590 に答える