なぜJavaの静的変数が更新されていませんか?

Mohasinアリ:

私はクラスの3つの静的オブジェクト(同じクラス自体をインスタンス化)し、int型(Iと呼ばれる)変数がされたカラーと呼ばれています。私は、クラスを実行すると、「I」変数は、コンストラクタでインクリメントしているが、それはメモリ内に永続化されていない、コードの下にこれを説明してください

package test;
public class Color
{
     public static  Color RED = new Color();
     public static final Color BLUE = new Color();
     public static final Color GREEN = new Color();
     static int i=0;

     Color(){
         System.out.println("Incrementing 'i'  here  "+(++i));
     }

     public static void main(String[] args) {
         System.out.println("The 'i' variable is not incremented here, it still shows '0' ,  'i' is: "+ Color.i );  // line 14 
        Color x = new Color();
        System.out.println(x.i);
    }
}

アウトは以下の通りです:

Incrementing 'i'  here  1
Incrementing 'i'  here  2
Incrementing 'i'  here  3
The 'i' variable is not incremented here, it still shows '0' ,  'i' is: 0
Incrementing 'i'  here  1
1
テッド・ジャンプ:

クラスがロードされ、リンクされている場合、そのstaticフィールドは、すべてデフォルト値に初期化されます。それが完了すると、静的フィールド初期化子は、このように、クラスの初期化を完了し、彼らはファイルに表示される順序で実行されています。このすべては、そのクラスが実行中で定義された任意のコードの前に起こります。それでは、ここで起こっては次のとおりです。

  1. REDGREENBLUE、及びi(そのデフォルト値に初期化されているnullためにColorフィールドと0のためi)。これは、任意の初期化子とは無関係であることに注意してください。
  2. フィールドの初期化子は、REDRED = new Color())を実行します。副作用として、i1にインクリメントされます。
  3. フィールドの初期化子がBLUE実行され、i2にインクリメントされます。
  4. フィールドの初期化子がGREEN実行され、i3にインクリメントされます。
  5. 以下のための初期化staticフィールドがi実行され、i値0が割り当てられます。
  6. main()この方法は、実行されと一致結果生成iとき0でmain()実行を開始します。

あなたには、このすべての血みどろの詳細を読むことができるJava言語仕様(JLS)の第12章およびJava仮想マシン仕様の第5章

あなたはの宣言移動するだけで期待される出力を得ることができますi先のことにColorフィールドを:

 static int i=0;
 public static  Color RED = new Color();
 public static final Color BLUE = new Color();
 public static final Color GREEN = new Color();

その後、出力は次のようになります。

「I」ここで1インクリメント
「I」ここで2インクリメント
ここでインクリメント「I」3
「I」変数はここでインクリメントされない、それは「0」、「i」は示していまだ:3
ここでインクリメント「iが」4
4

注意final修飾子がいるので、ここで初期化の順序には影響しませんGREENし、BLUE「定数変数」ではありませんJLSにおけるその用語の定義によれば。定数変数(単語の不運なペアリング)がプリミティブまたはあるString両方に宣言された変数finalおよび定数式に初期化。この場合には、new Color()定数式ではなく、Color一定の変数の適切なタイプではありません。例えば、参照してください§4.12.4JLSの

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=185905&siteId=1