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