1

コードの簡単なスニペットを次に示します。クラスのロードと初期化のプロセスについては、JLS セクション 12.4 と 12.5 に関連しています。クラスは、定数ではないクラスの静的変数にアクセスしている場合、または静的メソッドにアクセスしている可能性がある場合にのみロードされます。私の場合、変数を final として宣言し、final 属性を削除し、チェック クラスがロードされ、静的初期化子が実行されます。以下は変更されたコードです

class staticFinalDemo1  {    
    //static final int var= 100;    
    static int var= 100;    

        static final void test()  {    
           System.out.println("Static Final Method Test");    
    }    
    static  {    
               System.out.println("Static Initializer");    
    }    
}    


class staticFinalDemo2 {    

        public static void main(String[] args)   {    

            System.out.println(staticFinalDemo1.var);    
            //staticFinalDemo1.test();    
        }    
    }    

ここでのポイントは、最後のステートメントを変更して、次のステートメントに置き換える場合です。

 static final Integer var= 100; 

静的イニシャライザがロードされます。現在、この変数は定数です。この場合、静的初期化子をロードしているのはなぜですか? ラッパーオブジェクトを使用していて、クラスで使用のために参照するとそのインスタンスが初期化されるためですか? この概念を明確にしてください。

ベン

4

3 に答える 3

4

いいえ、この変数はコンパイル時の定数ではありません。定数は、プリミティブ型または文字列型のみにすることができます。整数は適格ではありません。

JLS §15.28を参照してください。

コンパイル時の定数式は、プリミティブ型の値を示す式、または突然完了しない String であり、以下のみを使用して構成されます: [...]

于 2013-07-17T18:10:28.517 に答える
2

非定数フィールドはコンストラクターで初期化されます。静的コンストラクターの静的フィールドとインスタンス コンストラクターのインスタンス フィールド。あなたの場合、整数型の変数を作成してバイトコードを表示してみてください。

class staticFinalDemo1 {
  static java.lang.Integer var;

  static {};
    Code:
       0: bipush        100
       2: invokestatic  #5                  // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
       5: putstatic     #6                  // Field var:Ljava/lang/Integer;
       8: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
      11: ldc           #7                  // String Static Initializer
      13: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      16: return
}

行 0 ~ 5 では、var フィールドに値が割り当てられます。bipush は 100 をスタックにロードし、invokestatic は Integer オブジェクトを作成し、putstatic はそれを静的変数に保存します。int 型の場合、これらの行はありません。値は定数プールに既に存在します。

于 2013-07-17T18:30:18.417 に答える