定義順

こんなクラスを作って動かしてみる。


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フィールドの順番を変更すると、
ちゃんと値が入る。


実は定義順って重要なんだと思いつつも、こんなケースはそうそうねーよと思う。