定義順
こんなクラスを作って動かしてみる。
public class Test {
static {
System.out.println("start: static initializer");
Test test = new Test();
System.out.println("end: static initializer");
}
private static Integer ykhr = new Integer(1000);
public Test() {
System.out.println(ykhr);
}
}
ポイントは、以下の点。
- staticイニシャライザでコンストラクタを呼んでいる。
- コンストラクタで、staticフィールドを表示している。
- staticのフィールドは、staticイニシャライザとコンストラクタの間に定義する。
これを、別クラスのmainメソッドで以下のように実行する。
public static void main(String[] args) {
Test test = new Test();
}
実行結果。
start: static initializer
null
end: static initializer
1000
ってなわけで、staticイニシャライザでコールしているコンストラクタでは、
staticフィールドはまだ値が入っていない。
その後の、mainメソッドからのコールでは、値が入っている。
staticイニシャライザとstaticフィールドの順番を変更すると、
ちゃんと値が入る。
実は定義順って重要なんだと思いつつも、こんなケースはそうそうねーよと思う。