私がチェックしたフィールドの初期設定時には前方参照をし、この@assyliasからの回答が、それでも私はに何の答えを得ない理由。
なぜ静的ブロックは、それの後に宣言された静的変数を割り当てることができますが、できないでそれにアクセスしますか?
class Parent {
static {
i = 2; // valid
// can only assign new value to it instead of accessing it?
// System.out.println(i); // invalid - compile-error
}
static int i = 0;
static {
i = 3; // valid
}
}
それは事実のためである:私達はちょうどそれを明示的に使用してからあなたを阻害して値が、まだ初期化されていませんか?または私が知らないセキュリティに関連する何かがあるのですか?
更新しました
これは約あるその問題の複製ではありません
アクセスしたときになぜこれが起こらないクラス名?
この質問は、私たちがこのデザインを持っている理由についてですか?どのような目的のために?
さらにいくつかの読みになった後、私はとパベルはこの時点では非常に正確ではないと思う@Holgerはコメントで指摘しました。
フィールドは静的であるため、我々は、不可能な、二回変数iを初期化してきました。
12.4.2。詳細な初期化手順が指摘します
各クラスまたはインタフェースCのために、ある固有の初期ロックLC。CからLCへのマッピングは、Java仮想マシンの実装の裁量に委ねられています。
私は初期化が想定倍長く、それだけだと、自身の初期化子クラスに大丈夫です、一度呼び出すクライアントへ。
私は基本的にはちょうどここが異なる説明でそれを再利用するので、しかし、パベルが提供するデモは、まだその位置を表します。
static {
i = 2;
j = i + 5;
// no one knows whether "i" here initialized properly here
}
static int i = 10;
static int j;
あなたが使用している場合でも、MyClass.i
直接ではj = MyClass.i + 5
、コンパイラは、次にとして大丈夫だろう知っている8.3.3。フィールドの初期設定時に前方参照は 4つの条件を詳細に説明します。
場合は具体的には、コンパイル時にエラーですべて以下のが真であります:
クラスまたはCインタフェースクラス変数の宣言は、クラス変数の使用後にテキストで表示されます。
使用が簡単な名前であり、 Cのクラス変数初期化子又はCの静的初期化子のいずれかで。
使用は、割り当ての左側にありません。
Cは、使用を囲む最も内側のクラスまたはインタフェースです。
そして、この中に詳細な議論がある答え既にが。
それを巻き上げるために、私はこれがためになると思い予測可能な動作これらの制限を追加します。もう一度、他の公式の目的はで指摘8.3.3。フィールドの初期設定時に前方参照。
これらの制限は、円形またはその他の不正な形式の初期化、コンパイル時に、キャッチするように設計されています。