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
ブロックは書けない(コンパイルエラー)。