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()で、引数なしのコンストラクタが呼ばれているんですね。