抽象クラスの継承

広告

それでは実際に抽象クラスを具体的に使ってみましょう。

まず抽象クラスそのものからオブジェクトを作成してみます。

ctest18.java

class ctest18{
  public static void main(String args[]){
    base c = new base();
  }
}

abstract class base{
  abstract public void dispName();

  public void dispCompany(){
    System.out.println("XYZ社製造の製品です");
  }
}

上記のような抽象クラスからオブジェクトを作成するようなプログラムを作成しコンパイルすると下記のようになります。

p1

エラーメッセージに出ているようにabstractクラスからオブジェクトを作成することは出来ません。abstractクラスと言うのは、クラスの中に少なくとも1つabstractメソッドが含まれています。abstractメソッドは中身が定義されていないメソッドですので、不完全なメソッドです。その為、abstractメソッドを含むabstractクラスからオブジェクトを作成することは出来ません。

abstractクラスは、継承して利用されることを前提したクラスであることに気をつけて下さい。

では次にabstractクラスを継承したクラスで、abstractメソッドを実装しなかった場合を試してみます。

ctest19.java

class ctest19{
  public static void main(String args[]){
    seihinA c = new seihinA();
  }
}

abstract class base{
  abstract public void dispName();

  public void dispCompany(){
    System.out.println("XYZ社製造の製品です");
  }
}

class seihinA extends base{
  public void dispVersion(){
    System.out.println("バージョンは1.0です");
  }
}

今度はabstractクラスであるbaseクラスを継承したseihinAクラスを作成し、seihinAクラスのオブジェクトを作成しようとしています。seihinAクラスでは継承したbaseクラスに含まれているabstractメソッドのdispNameメソッドをオーバーライドしていません。

p2

上記のエラーメッセージは次のことを表しています。抽象クラスを継承したクラスでは、継承した抽象クラスに含まれている抽象メソッドをオーバーライドするか、オーバーライドしない場合には継承したクラスもabstractクラスにするかどちらかにする必要があります。

つまりabstractクラスを継承した場合に、abstractメソッドをオーバーライドしなかった場合には、まだ未定義のメソッドが含まれたままになってしまいますので、継承したクラスもabstractクラスになってしまうわけです。その為、オーバーライドしない場合には次のように記述しておく必要があります。

abstract class base{
  abstract public void dispName();

  public void dispCompany(){
    System.out.println("XYZ社製造の製品です");
  }
}

abstract class seihinA extends base{
  public void dispVersion(){
    System.out.println("バージョンは1.0です");
  }
}

当然のことながら、seihinAクラスも抽象クラスですので、seihinAクラスからオブジェクトを作成することは出来ません。

最後にabstractクラスに含まれるabstractメソッドを継承したクラスで実装した例を見てみます。

ctest20.java

class ctest20{
  public static void main(String args[]){
    seihinA c = new seihinA();

    c.dispName();
  }
}

abstract class base{
  abstract public void dispName();

  public void dispCompany(){
    System.out.println("XYZ社製造の製品です");
  }
}

class seihinA extends base{
  public void dispName(){
    System.out.println("製品名はXXXです");
  }

  public void dispVersion(){
    System.out.println("バージョンは1.0です");
  }
}

今回はabstractクラスを継承したクラスにて、実装が必要なメソッドをオーバーライドしていますので、コンパイルでエラーは発生せず実行も行えます。実際に行った結果は下記のようになります。

p3

抽象クラスはうまく使うことで、大規模なクラス設計を大人数で行う場合などに非常に有効な場合があります。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。