7
 class Z
{
    static final int x=10;
    static
    {
        System.out.println("SIB");
    }

}
public class Y
{
    public static void main(String[] args)
    {
        System.out.println(Z.x);
    }
}

出力:10この場合静的初期化ブロックがロードされないのはなぜですか?static x呼び出しの場合、クラスzのすべての静的メンバーを少なくとも1回ロードする必要がありますが、静的初期化ブロックはロードされません。

4

6 に答える 6

1

コンパイル時のZx値は10になります。

static final int x=10; is constant

したがって、コンパイラはインラインの後に以下のようなコードを作成します

System.out.println(10); //which is not calling Z class at runtime
于 2013-03-26T09:42:36.483 に答える
1

宣言に静的修飾子が含まれて いるフィールドは、静的フィールドまたはクラス変数と呼ばれます。それらは、オブジェクトではなく、クラスに関連付けられています。クラスのすべてのインスタンスは、メモリ内の1つの固定された場所にあるクラス変数を共有します。どのオブジェクトでもクラス変数の値を変更できますが、クラスのインスタンスを作成せずにクラス変数を操作することもできます

したがって、Z.x以下のように呼び出すと:

System.out.println(Z.x);

その固定メモリ位置からZ.x取得することを呼び出す場合を除いて、クラスは初期化されません。x

静的ブロックは、JVMがロードされるときに実行されますclass Zxクラスをロードせずに直接アクセスできるため、ここでロードされることはありません。

于 2013-03-26T09:52:20.307 に答える
1

その理由は、jvmがクラスをロードすると、クラスのすべての定数メンバーが定数領域に配置されるためです。必要な場合は、クラス名で直接呼び出すだけです。つまり、のクラ​​スをインスタンス化する必要はありません。 Z.したがって、静的初期化ブロックは実行されません。

于 2013-03-26T09:56:30.980 に答える
0

クラスがロードされないため、実行されません。

public class Y
{
    public static void main(String[] args)
    {
        Z z new Z(); //will load class
        System.out.println(Z.x);
    }
}

上のxフィールドZはで宣言されているstatic finalため、固定のメモリ位置に作成されます。このフィールドにアクセスするために、クラスをロードする必要はありません。

于 2013-03-26T09:33:46.473 に答える
0

Xがfinalでなかった場合、その場合、JVMはクラス「Z」をロードする必要があり、静的ブロックのみが実行されます。これで、JVMは「Z」クラスをロードする必要がないため、静的ブロックは実行されません。

于 2013-03-26T09:47:29.613 に答える
0

定数が静的finalとして宣言されている場合、その定数は完全定数と呼ばれます。コンパイラがクラスyをコンパイルし、sop(Zx)をコンパイルしているときに、sop(Zx)をsop(10)に置き換えます。bczxは完全な定数です。つまり、バイトコードクラスYではクラスZを使用しないため、クラスYの実行中はクラスZは使用されません。そのため、クラスZのSIBは実行されません。

于 2014-06-24T16:14:31.390 に答える