私はJavaで静的初期化子を研究しています。下記のように私は、ソースコードを来た:静的イニシャライザがJavaで静的変数の再初期化を許可するのはなぜですか?
public class A {
private static int count = 5;
final static int STEP = 10;
boolean alive;
static {
count = 1;
}
public static void main(String[] args) {
A a = new A();
System.out.println(A.count);
}
}
私の質問は、なぜコンパイラは、静的初期化子ブロックでcount = 1
に値1
を再割り当てされている変数count
文句を言っていないことです。私は、Javaが宣言前読み取りルール(つまり、宣言の前にすべての識別子を読み取るべきではない)が続くことを前向きにしている限り、Javaは前方参照を許可していますが、すべての初期化子が参照されていなければ、参照割り当ての左側にある。私はまた、複数の静的初期化子式と静的フィールド初期化子ブロックがクラスに書き込まれている場合、その実行順序は順次であることも知っています。
私によれば、クラスはロードされてから、すべての静的初期化子(式とブロック)が順番に実行され、count
は値5
に初期化され、次にデフォルトのコンストラクタsuper()を呼び出し、インスタンス変数alive
をデフォルト値に初期化して実行されます。しかし、静的変数count
が再初期化されたというエラー(なぜなら、前方参照の場合ではない)を出さない理由は、代わりに出力1
です。 これは、静的変数を静的イニシャライザブロックで再初期化できるということですか?助けてください。前もって感謝します! :)
どうすればよいですか? – EJP
変数を再初期化しておらず、変数を再割り当てしています –