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 |
package specification.initialize_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(); } { System.out.println("メインクラス"); } public void method() { InnerClass innerObj = new InnerClass(); Class2 obj = new Class2(); } class InnerClass { { System.out.println("インナークラス"); } } } class Class1 { { System.out.println("パッケージ内クラス1"); } } class Class2 { { System.out.println("パッケージ内クラス2"); } } |
上記のコードの実行結果は以下のとおり。
|
1 2 3 4 5 6 |
スタティックメソッド内 パッケージ内クラス1 別パッケージクラス メインクラス インナークラス パッケージ内クラス2 |
実行時の流れは以下のとおり。
MainClassが読み込まれるMainClassのmain()メソッド(static)実行main()メソッド内で- MainClassと同じソース内の
Class1のインスタンス生成
→Class1のインスタンスの初期化ブロック実行 - 別のソースの
OuterClassのインスタンス生成
→OuterClassのインスタンスの初期化ブロック実行 MainClassのインスタンス生成
→MainClassのインスタンスの初期化ブロック実行MainClassのインスタンスのmethod()メソッド実行method()メソッド内でMainClassのインナークラスInnerClassのインスタンス生成
→InnerClassのインスタンスの初期化ブロック実行- MainClassと同じソース内の
Class2のインスタンス生成
→Class2のインスタンスの初期化ブロック実行
- MainClassと同じソース内の