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と同じソース内の