staticブロックは、クラスが呼ばれるタイミング、コードが実行される前に実行される。インスタンス生成時に実行される初期化ブロックよりも早いタイミングで、クラススコープの変数の初期化などに用いることができる。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package specification.static_block; public class MainClass { public static void main(String[] args) { System.out.println("スタティックメソッド内"); Class1 obj = new Class1(); OuterClass outerObj = new OuterClass(); MainClass app = new MainClass(); app.method(); } static { System.out.println("メインクラス"); } public void method() { Class2 obj = new Class2(); } class InnerClass { /* インナー型 MainClass.InnerClass で static イニシャライザーを定義できません static { System.out.println("インナークラス"); } */ } } class Class1 { static { System.out.println("パッケージ内クラス1"); } } class Class2 { static { System.out.println("パッケージ内クラス2"); } } |
上記のコードの実行結果は以下のとおり。
|
1 2 3 4 5 |
メインクラス スタティックメソッド内 パッケージ内クラス1 別パッケージクラス パッケージ内クラス2 |
実行時の流れは以下のとおり。
MainClassが読み込まれる
→MainClassのstaticブロック実行MainClassのmain()メソッド(static)実行main()メソッド内で- MainClassと同じソース内の
Class1のインスタンス生成
→Class1のstaticブロック実行 - 別のソースの
OuterClassのインスタンス生成
→OuterClassのstaticブロック実行 MainClassのインスタンス生成MainClassのインスタンスのmethod()メソッド(public)実行method()メソッド内でMainClassと同じソース内のClass2のインスタンス生成
→Class2のstaticブロック実行
- MainClassと同じソース内の
MainClassの動作を見ると、staticブロックが実行されるのはインスタンス生成時ではなく、クラスが読み込まれるタイミングとなっている。
その他のクラスはインスタンス生成時にクラスが呼ばれ、staticブロックが実行されている(宣言のみではstaticブロックは実行されない)。
インナークラスではstaticブロックは書けない(コンパイルエラー)。