auの日記

プログラミング初心者の日記。(auはハンドルネームです)

Javaのサブクラスのコンストラクタの動き

auです。

Javaの継承でうまく理解していなかった部分があったのでまとめようと思います。

Javaの継承

Javaの継承をした際に、コンストラクタが呼ばれるのですが、その際の挙動をうまく理解していませんでした。

以下のコードを書きました。

public class Parent {
	Parent() {
		System.out.println("Parent");
	}
}
public class Child extends Parent {
	Child() {
		System.out.println("Child");
	}
}
public class Main {
	public static void main(String[] args) {
		Parent p = new Parent();
		Child c = new Child();
	}
}

childはparentを継承しており、それぞれのコンストラクタでクラス名を表示しています。

Mainでそれぞれインスタンス化していますね。

出力結果はこうなります。

Parent
Parent
Child

Parentは1回しか呼ばれていないように思えますが、2回呼ばれた後にChildが出ています。

これは、
1. Parentクラスのコンストラクタが呼び出されている
2. Childクラスのコンストラクタの1行目に「super()」がコンパイラによって自動的に追加されるため、Parentのコンストラクタが呼び出される
3. Childのコンストラクタのprint行が実行される

という流れのためです。

つまり、Childクラスは以下のようなコードになっているというわけです。

public class Child extends Parent {
	Child() {
		super();
		System.out.println("Child");
	}
}

super()で、引数なしのコンストラクタが呼ばれているんですね。