抽象クラス

抽象クラスとは、クラス構造の雛型を定義する目的だけのために作成されるクラスといえます。
次の図を見てください。

動物クラス
食べる(eat)
動く( move )
ライオンクラス(raion)
食べる(肉)
動く(走る)
りすクラス(risu)
食べる(木の実)
動く(木に登る)
犬クラス(dog)
食べる(ドッグフード)
動く(歩く)

つまりここでは動物クラス(Animal)があります。
動物にはたくさんの種類がありますがしかし共通して行うことがあります。
それは食べたり、動いたりすることです。

しかし、動物の種類により食べ物も違います。たとえばライオンクラス、りすクラス、犬クラスを作成した場合に

ライオンは肉を食べ、りすは木の実を食べ、犬はドッグフードを食べます。


また動きも動物によってその特徴がそれぞれ違います。


いわゆる抽象クラスとはこのように動物クラスにはおおまかなカデゴリ的なことだけを定義しておいて
その細かい操作的なことは各クラス内で定義することです。

今回は食べるメソッドと動くメソッドだけを動物クラスに定義しておいてその内容は各クラスに引き渡されます。

このような共通の情報を抽象的に持つクラスのことを抽象クラスといいます。

抽象クラスは具体的な操作方法を定義できないためインスタンス化できません。

抽象クラスで宣言するにはキーワードabstractをつけます。

また、抽象クラスは必ず継承してサブクラス化してやらなければいけません。

つまりfinal(サブクラスを持てない)とabstractはまったく逆の意味になります。
したがってfinalとabstractを同時に宣言することができません。

ではサンプルプログラムを見ていきます。

サンプルプログラム(Sample100.java)

//動物クラス


abstract class Animal{

  abstract void eat();
  abstract void move();
 }
//ライオンクラス
class raion extends Animal{

 public void eat(){

 System.out.println("ライオンは肉を食べる");

 }

 public void move(){

 System.out.println("ライオンが獲物を追いかけています");

 }
}
//リスクラス
class risu extends Animal{

 public void eat(){

 System.out.println("リスは木の実を食べる");

 }

 public void move(){

 System.out.println("リスが木を登ろうとしています");

 }
}
//犬クラス
class dog extends Animal{

 public void eat(){

 System.out.println("犬はドッグフードを食べます");

 }

 public void move(){

 System.out.println("犬が舌を出しながら歩いています");

 }
}

class Sample100{
    public static void main(String args[]){
     
      raion ra = new raion();
      risu ri = new risu();
      dog inu = new dog();

       ra.eat();
       ra.move();

       System.out.println("---------------------");

      ri.eat();
      ri.move();

     System.out.println("-----------------------");

     inu.eat();
     inu.move();
    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

結果はこのようになります。
Animalクラスにはメソッドの定義しか記述していません。
まだ説明してませんでしたけどAnimalクラス内で定義しているメソッドにもabstractがついています。

これを抽象メソッドと呼びます。

抽象メソッドは本体のないメソッドです。
つまり抽象メソッド内には何の処理を記述できないのです。

抽象メソッドの定義方法

abstract void メソッド名();

抽象メソッド内には何も処理を記述できません。
したがって、必ずセミコロンで終了しなければいけません。

サンプルプログラム(Sample100_1.java)

//動物クラス


final abstract class Animal{

  abstract void eat();
  abstract void move();
 }
//ライオンクラス
class raion extends Animal{

 public void eat(){

 System.out.println("ライオンは肉を食べる");

 }

 public void move(){

 System.out.println("ライオンが獲物を追いかけています");

 }
}
//リスクラス
class risu extends Animal{

 public void eat(){

 System.out.println("リスは木の実を食べる");

 }

 public void move(){

 System.out.println("リスが木を登ろうとしています");

 }
}
//犬クラス
class dog extends Animal{

 public void eat(){

 System.out.println("犬はドッグフードを食べます");

 }

 public void move(){

 System.out.println("犬が舌を出しながら歩いています");

 }
}

class Sample100_1{
    public static void main(String args[]){
      raion ra = new raion();
      risu ri = new risu();
      dog inu = new dog();

       ra.eat();
       ra.move();

       System.out.println("---------------------");

      ri.eat();
      ri.move();

     System.out.println("-----------------------");

     inu.eat();
     inu.move();

    }

}

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

最初に説明した通りfinalとabstractはまったく正反対の意味になります。
したがってこの組み合わせはできないのでコンパイルエラーになります。

ページのトップへ戻る