多態性とは「多形態」を意味し、継承によって互いに関連するクラスが多数ある場合に発生します。
たとえば、名前は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が留守番する"); } }実行結果
//インターフェースを宣言 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(); } }実行結果