クラスの初期化手順

1.スーパークラスのクラス変数初期化子、static初期化子(実行順序は記述順)
2.サブクラスのクラス変数初期化子、static初期化子(実行順序は記述順)
3.スーパークラスのインスタンス変数初期化子、インスタンス初期化子(実行順序は記述順)
4.スーパークラスのコンストラクタ
5.サブクラスのインスタンス変数初期化子、インスタンス初期化子(実行順序は記述順)
6.サブクラスのコンストラクタ
このうち、1,2のクラス変数初期化子、static初期化子はクラスの初期化時に一度だけ実行される点に注意。
(クラスの初期化の詳細は後述)
※クラス変数とはstaticフィールド、インスタンス変数とは非staticフィールドを表す。
クラスの初期化とは,その静的初期化子とそのクラス中に宣言されているstatlcフィールド初期化子の実行からなる処理である。
厳密には以下のいずれかが最初に発生する直前にクラスが初期化される。
・Tがクラスであり、Tのインスタンスが生成される場合
・Tがクラスであり、Tによって宣言されているstaticメソッドが起動される場合
・Tによって宣言されているstaticフィールドに代入が行われる場合
・Tによって宣言されているstaticフィールドが使用され、そのフィールドが定数変数でない場合
・Tがトップレベルクラスであり、T内で字句的にネストされているassert文が実行された場合
文献によってはクラスのロード時にクラスが初期化されるとか書いているものがあるが、ロードと初期化は別物なので注意。
実際、ClassLoaderでクラスを明示的にロードしてもクラスは初期化されない。
※参考 Java言語仕様第3版 281ページ 12.4.1 初期化が行われる時

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です