JLSのセクションを見つけることができます:§12.4.2。
詳細な初期化手順:
9.次に、クラスのクラス変数イニシャライザと静的イニシャライザ、またはインターフェイスのフィールド初期化子のいずれかを、それらが単一のブロックであるかのようにテキスト順に実行します。ただし、最終的なクラス変数と、値がコンパイルされるインターフェイスのフィールドは除きます。 -時定数が最初に初期化されます
したがって、3つの静的変数はテキスト順に1つずつ初期化されます。
そう
static A obj = new A();
//num1 = 1, num2 = 1;
static int num1;
//this is initilized first, see below.
static int num2=0;
//num1 = 1, num2 = 0;
注文を次のように変更した場合:
static int num1;
static int num2=0;
static A obj = new A();
結果はになります1,1
。
static int num1;
(§8.3.2)は変数初期化子ではないことに注意してください:
フィールド宣言子が変数初期化子を含む場合、宣言された変数への割り当て(15.26)のセマンティクスを持ち、宣言子がクラス変数(つまり、静的フィールド)の場合、変数初期化子はクラスが初期化されるときに評価され、割り当てが正確に1回実行される
そして、このクラス変数は、クラスが作成されるときに初期化されます。これが最初に起こります(§4.12.5)。
プログラム内のすべての変数には、その値を使用する前に値が必要です。各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます(§15.9、§15.10):バイト型の場合、デフォルト値ゼロ、つまり(byte)0の値。タイプshortの場合、デフォルト値はゼロ、つまり(short)0の値です。int型の場合、デフォルト値はゼロ、つまり0です。long型の場合、デフォルト値はゼロ、つまり0Lです。float型の場合、デフォルト値は正のゼロ、つまり0.0fです。タイプdoubleの場合、デフォルト値は正のゼロ、つまり0.0dです。char型の場合、デフォルト値はnull文字、つまり「\ u0000」です。ブール型の場合、デフォルト値はfalseです。すべての参照タイプ(4.3)では、デフォルト値はnullです。