Developer

【はじめてのJava】superを使ったコンストラクタの呼び出し【クラスの継承編】
2022.02.27
Lv1

【はじめてのJava】superを使ったコンストラクタの呼び出し【クラスの継承編】

はじめてのJava

このシリーズでは、初めてJavaやプログラミングを勉強する方向けに、Javaによるプログラミングの基礎を説明していきます。
目標レベルは、Javaの資格試験の一つである「Oracle Certified Java Programmer, Silver」(通称Java Silver)に合格できる程度の知識の習得です。
はじめてJavaやプログラムに触れる方にもできるだけわかりやすい解説を心がけていきます。


クラスの継承編

クラスの継承編では、Javaを扱う上で重要な「クラスの継承」について扱っていきます。

前回まででthisの使い方superによるメソッド呼び出しを扱いました。

ここからはsuperを利用したコンストラクタの呼び出し方について扱います。
前回はコンストラクタの動き方を把握するために重要なデフォルトコンストラクタについて扱いました。

引き続き今回は、クラスの継承があるときのコンストラクタの動きを考えていきます。


目次


クラスの継承時のインスタンス

クラスが継承されているとき、 子クラスのインスタンスの内部には親クラスのインスタンスの要素が含まれます 

例えば、以前CarクラスとPoliceCarクラスを扱いました。

このクラスを基にPoliceCarクラスをインスタンス化すると、「PoliceCarのインスタンス内部にCarのインスタンス部分がある」状態になります。

言い方を変えると PoliceCarクラスのインスタンス生成時にはCarクラスのインスタンスも生成されます 

つまり、PoliceCarクラスをインスタンス化する際にはCarクラスもインスタンス化されるのです。


継承時のインスタンス化の動き

ここで改めて、インスタンス化の時の動きを考えます。

クラスの継承がある場合は「親クラスのインスタンス部分⇒子クラスのインスタンス部分」の順番でインスタンス化が行われます。

つまり、親クラスのインスタンス化が先に起こるのです。

この時、 特に指定していない場合は親クラスのインスタンスは引数が空のコンストラクタによって初期化されます 。もし親クラスにコンストラクタが複数定義されている場合でも、親クラスで定義されたインスタンス部分は引数が空のコンストラクタでインスタンス化が行われるのです。

例えば以下のように2つのコンストラクタを持ったCarクラスと、それを継承したPoliceCarクラスがあったとします。

class Car{
  double speed;
  String color;
  Car(){ //☆
    this.speed = 0;
    this.color = "Red";
  }
  Car(String color){
    this.speed = 0;
    this.color = color;
  }
}
class PoliceCar{
  PoliceCar(){
    //何もしない
  }
  PoliceCar(String color){
    //★Car("White");としたい・・・
  }
}

この時、PoliceCarクラスをインスタンス化すると、Carクラス⇒PoliceCarクラスの順でインスタンス化が起こります。

もしここでPoliceCarクラスのインスタンス化の際にPoliceCar("White")としても、Carクラスのインスタンス化の際には引数が空のコンストラクタ(☆)が動いてしまうため、PoliceCarの色はRedになってしまいます。

ではもし、引数Whiteを使用するコンストラクタを使いたい場合はどうすればいいでしょうか。


superを利用したコンストラクタの指定

ここで、superキーワードが登場します。

子クラスのコンストラクタ内でsuper(引数)とすることで 親クラスのインスタンス部分をインスタンス化する際のコンストラクタを指定することができます 

例えば今回の場合、PoliceCarクラスを以下のようにすることで 引数を指定して親クラスのインスタンス部分を生成することができる のです。

class PoliceCar{
  PoliceCar(){
    //何もしない
  }
  PoliceCar(String color){
    super("White"); //super(引数)とすればよい★
  }
}

 


まとめ

・インスタンス化の際には指定が無ければ「引数が空のコンストラクタ」で自動的に初期化される
・親クラスのインスタンス部分をインスタンス化する際には自動的に引数がないコンストラクタが指定される
・子クラスのコンストラクタでsuper(引数)とすることで、親クラスのインスタンス部分をインスタンス化するコンストラクタを指定することができる。


次回

次回はsuperを用いたインスタンス化の注意点について扱います。


はじめてのJavaシリーズの目次はこちら
クラスの継承編はこちら


java 11 の練習問題一覧はこちら
はじめてのJavaシリーズの練習問題一覧はこちら