スーパークラスのコンストラクタ

広告

クラスを作成した際にコンストラクタを作成しているとまずコンストラクタが呼ばれますが、他のクラスを継承している場合にスーパークラスのコンストラクタの扱いがどうなっているのかを確認します。

下記のような簡単なサンプルを作成します。クラスBはクラスAを継承し、クラスCはクラスBを継承しています。それぞれにコンストラクタを記述してからクラスCのオブジェクトを作成してみましょう。

ctest14.java

class ctest14{
  public static void main(String args[]){
    C sample = new C();
  }
}

class A{
  A(){
    System.out.println("クラスAのコンストラクタ");
  }
}

class B extends A{
  B(){
    System.out.println("クラスBのコンストラクタ");
  }
}

class C extends B{
  C(){
    System.out.println("クラスCのコンストラクタ");
  }
}

実際に実行してみると下記のようになります。

p4

見ていただくとお分かりのように大元のクラスのコンストラクタから順に呼ばれています。

クラスの継承を行った場合は、特に記述しなくてもコンストラクタの先頭で「super()」が呼ばれています。その為、先ほどのサンプルは下記のように記述したことと同じです。

class ctest14{
  public static void main(String args[]){
    C sample = new C();
  }
}

class A{
  A(){
    super();
    System.out.println("クラスAのコンストラクタ");
  }
}

class B extends A{
  B(){
    super();
    System.out.println("クラスBのコンストラクタ");
  }
}

class C extends B{
  C(){
    super();
    System.out.println("クラスCのコンストラクタ");
  }
}

※クラスAは明示的に他のクラスを継承はしていませんが、クラスは基本的に「java.lang.Object」のサブクラスとなっています。その為、全てのクラスはjava.lang.Objectのコンストラクタが必ず呼ばれています。

引数のあるスーパークラスのコンストラクタ

特に記述しなければ「super()」が呼ばれてスーパークラスの引数無しのコンストラクタが呼び出されていましたが、スーパークラスで引数があるようなコンストラクタが定義されている場合にそのコンストラクタの方を呼び出すことも可能です。

引数のあるスーパークラスのコンストラクタを呼び出すには「super(引数)」の形で呼び出します。

簡単なサンプルで試して見ましょう。

class ctest15{
  public static void main(String args[]){
    B sample = new B();
  }
}

class A{
  A(){
    System.out.println("クラスAのコンストラクタ");
  }

  A(int num){
    System.out.println("クラスAの引数有りコンストラクタ");
  }
}

class B extends A{
  B(){
    super(10);
    System.out.println("クラスBのコンストラクタ");
  }
}

実際に実行してみると下記のようになります。

p5

superはコンストラクタの1行目に必ず記述しなければなりませんので注意して下さい。(よって当然のことながら2つのスーパークラスのコンストラクタを呼び出すことはできません)。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)