序文
Javaのプログラムでは、オブジェクトがインスタンス化されると、そのオブジェクトのクラスのすべてのメンバ変数が初期化され、初期化が完了して初めてコンストラクタ・メソッドが呼び出されてオブジェクトが生成されます。一緒に見てみましょう。
初期化ルール
- 変数はブロックより優先され、静的変数は非静的変数より優先されます。
- 親クラスは、派生クラスよりも優先して初期化されます。
- 変数定義がさまざまなメソッド定義の間に散らばっていても、コンストラクタ・メソッドが呼び出される前に初期化されます。
コード例
class Father {
public Father() {
System.out.println("親クラスのコンストラクタ・メソッド");
}
String str = "親クラスの非静的変数 ";
{
System.out.println(str);
System.out.println("親クラスの非静的ブロック");
}
static String strStatic = "親クラスの静的変数 ";
static {
System.out.println(strStatic);
System.out.println("親クラス静的ブロック");
}
}
public class Son extends Father {
public Son() {
System.out.println("サブクラスのコンストラクタ ");
}
String str = "非静的変数をサブクラス化する ";
{
System.out.println(str);
System.out.println("サブクラス非静的ブロック");
}
static String strStatic = "サブクラスの静的変数 ";
static {
System.out.println(strStatic);
System.out.println("サブクラス静的ブロック");
}
public static void main(String[] args) {
new Son();
}
}
//結果
親クラスの静的変数
親クラスの静的ブロック
サブクラスの静的変数
サブクラスの静的ブロック
親クラスの非静的変数
親クラスの非静的ブロック
親クラスのコンストラクタ
非静的変数をサブクラス化する
サブクラスの非静的ブロック
サブクラスのコンストラクタ