第12章 多態性

この章では多態性に関する基本的な考え方について説明します。

HOMEPAGE

多態性


多態性とは「多形態」を意味し、継承によって互いに関連するクラスが多数ある場合に発生します。
たとえば、名前はAnimalというスーパークラスがanimalSound()があります。動物のサブクラスには、猫、犬、鳥などがあります。また、動物のサウンドを独自に実装することもできます(猫の鳴き声、犬の鳴き声など)。

例:[JSample12_1.java]

package JSample;
class Animal {
  public void animalSound() {
    System.out.println("動物が鳴いた");
  }
}
class Cat extends Animal {
  public void animalSound() {
    System.out.println("猫が鳴いた");
  }
}
class Dog extends Animal {
  public void animalSound() {
    System.out.println("犬が鳴いた");
  }
}
class JSample12_1 {
  public static void main(String[] args) {
    Animal myAnimal = new Animal();
    Animal myCat = new Cat();
    Animal myDog = new Dog();
    myAnimal.animalSound();
    myCat.animalSound();
    myDog.animalSound();
  }
}
実行結果
動物が鳴いた
猫が鳴いた
犬が鳴いた


コードの再利用性に役立ちます。新しいクラスを作成するときに、既存のクラスの属性とメソッドを再利用します。

例:[JSample12_1.java]

package JSample;
public class JSample12_1 {
    public static void main(String[] args) {
      show(new Cat());  
      show(new Dog()); 
      Animal doubutsu = new Cat();    
      doubutsu.eat();              
      Cat neko = (Cat)doubutsu;         
      neko.work();       
    }  
    public static void show(Animal doubutsu)  {
      doubutsu.eat();  
      if (doubutsu instanceof Cat)  { 
            Cat neko = (Cat)doubutsu;  
            neko.work();  
      } else if (doubutsu instanceof Dog) { 
            Dog inu = (Dog)doubutsu;  
            inu.work();  
      }  
    }  
}
abstract class Animal {  
    abstract void eat();  
}  
class Cat extends Animal {  
    public void eat() {  
        System.out.println("Catが食べた");  
    }  
    public void work() {  
        System.out.println("Catはネズミを捕まえた");  
    }  
}  
class Dog extends Animal {  
    public void eat() {  
        System.out.println("Dogが食べた");  
    }  
    public void work() {  
        System.out.println("Dogが留守番する");  
    }  
}
実行結果
Catが食べた?
Catはネズミを捕まえた
Dogが食べた?
Dogが留守番する
Catが食べた?
Catはネズミを捕まえた


インターフェース インターフェースとは、クラスに含まれるメソッドの具体的な処理内容を記述せず、変数とメソッドの型のみを定義したものです 以下のようにインターフェースを宣言および実装を行います。
//インターフェースを宣言
interface インターフェース名{}
//インターフェースを実装
class クラス名 implements インターフェース名{}
例:[JSample12_3.java]
public class JSample12_3 {
    public static void main(String[] args) {
        ControlBikeIf myBike = new BikeGo();
        myBike.start();
        myBike.speedup();
        myBike.speeddown();
        myBike.stop();
        myBike.start();
    }
}   
[ControlBikeIf.java]
public interface ControlBikeIf {
    void start();
    void stop();
    void speedup();
    void speeddown();
}  
[ControlBikeIf.java]
public interface ControlBikeIf {
    void start();
    void stop();
    void speedup();
    void speeddown();
}  
[BikeGo.java]
public class BikeGo implements ControlBikeIf {
    public void start() {
        System.out.println("エンジン起動");
    }
    public void stop() {
        System.out.println("エンジン停止");
    }
    public void speedup() {
        System.out.println("速度アップ");
    }
    public void speeddown() {
        System.out.println("速度ダウン");
    }
}
実行結果
エンジン起動
速度アップ
速度ダウン
エンジン停止
エンジン起動



練習

問題[JEx12_1]
SubClassをプリントするプログラムを2行で完成しなさい

        
package JSample;
class SuperClass {
    public void superclass() {
        System.out.println("This is SuperClass!");
    }
}
class SubClass1 extends SuperClass {
    public void superclass() {
        System.out.println("This is SubClass1!");
    }
}
class SubClass2 extends SuperClass {
    public void superclass() {
        System.out.println("This is SubClass2!");
    }
}
public class Ex12_1 {
    public static void main(String[] args) {
        SuperClass a;
        
        //処理
        ______①__________
        ______②__________
        a = b;
        a.superclass();
        a = c;
        a.superclass();
    }
}
実行結果
This is SubClass1!
This is SubClass2!



戻る