導入
動的束縛の一番の恩恵は、「型がバラバラのインスタンスを、共通の親の型でひとまとめに扱える」 ことです。Dog と Cat を混ぜて配列に入れ、まとめてループ処理してみましょう。
説明
public class Main {
public static void main(String[] args) {
Animal[] animals = { new Dog(), new Cat(), new Dog() };
for (Animal a : animals) {
a.sound();
}
}
}
class Animal {
void sound() {
System.out.println("なんらかの音");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("ワン");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("ニャー");
}
}
Animal[] という 共通の親の型の配列 に、Dog や Cat のインスタンスを混ぜて入れられます。for ループの中は a.sound() という たった1つの書き方 だけですが、実際には Dog なら「ワン」、Cat なら「ニャー」と、それぞれの実体に応じた振る舞いをします。もし多態性がなければ、if (動物の種類 == 犬) { ... } else if (...) { ... } のような分岐だらけのコードになっていたはずです。
やってみよう
下のエディタで配列の中身の組み合わせや順番を変えて実行し、それぞれの実体に応じた sound() が呼ばれることを確認しましょう。
演習
Bird extends Animal(sound() は "チュンチュン")を追加してください。main で Animal[] animals = { new Dog(), new Bird(), new Cat() }; という配列を作り、拡張forで sound() を呼んでください。
ヒント1を見る
Dog・Cat・Bird の3クラスをそれぞれ用意し、配列の順番は Dog, Bird, Cat にします。
ヒント2を見る
for (Animal a : animals) { a.sound(); } で1つずつ呼び出します。