スコープの実行順

初期化子には static { }, { }, クラス名 { }(コンストラクタのこと)がある。
final staticのフィールドもstatic { }の中では変更できるみたいです。
finalのフィールドは{}とクラス名{}の中なら可能。


http://www.ne.jp/asahi/hishidama/home/tech/java/strange.html

いつもながらここのサイトに詳しく書かれてます。
以下はそれぞれの初期化子の呼び出しの順番のテスト

class ScopeTest {
  static String s1;
  final static String s2;

  String s3;
  final String s4;

  static {
    p("-- static initialize --");
    s1 = "static String";
    s2 = "final static String";
    p(s1); p(s2);
  }

  {
    p("-- local initialize --");
    s3 = "String";
    s4 = "final String";
    p(s3); p(s4);
  }

  static void p(Object o) { System.out.println(o); }
  ScopeTest() { p("-- construct --"); }
  public static void main(String[] args) {
    new ScopeTest();
  }
}