本文へスキップ
BecomeCoder

Javaオブジェクト指向コース · 第4章 多態性 ― 同じ呼び方で、違う動きをする · レッスン13

親の型で受け取る ― ポリモーフィズムの威力

ブラウザで完結

導入

動的束縛の一番の恩恵は、「型がバラバラのインスタンスを、共通の親の型でひとまとめに扱える」 ことです。DogCat を混ぜて配列に入れ、まとめてループ処理してみましょう。

説明

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[] という 共通の親の型の配列 に、DogCat のインスタンスを混ぜて入れられます。for ループの中は a.sound() という たった1つの書き方 だけですが、実際には Dog なら「ワン」、Cat なら「ニャー」と、それぞれの実体に応じた振る舞いをします。もし多態性がなければ、if (動物の種類 == 犬) { ... } else if (...) { ... } のような分岐だらけのコードになっていたはずです。

やってみよう

下のエディタで配列の中身の組み合わせや順番を変えて実行し、それぞれの実体に応じた sound() が呼ばれることを確認しましょう。

演習

Bird extends Animalsound()"チュンチュン")を追加してください。mainAnimal[] animals = { new Dog(), new Bird(), new Cat() }; という配列を作り、拡張forで sound() を呼んでください。

ヒント1を見る

DogCatBird の3クラスをそれぞれ用意し、配列の順番は Dog, Bird, Cat にします。

ヒント2を見る

for (Animal a : animals) { a.sound(); } で1つずつ呼び出します。

実際に動かしてみよう

下のエディタにJavaを書いて「実行」を押すと、学習用シミュレータが System.out.println の出力を表示します(本物のJVMではなく、教材の範囲を再現した軽量エンジンです)。クラス・継承・コレクションなども動きます。Scanner で入力を読む例は「標準入力」欄に値を入れてください。本文の例を書き換えて動かしてみましょう(Stream・ラムダ・スレッド・ファイル入出力など一部の機能は対象外です)。

Java — ブラウザ内で実行(学習用シミュレータ)

Javaの教材サブセットを動かす学習用シミュレータを読み込みます(本物のJVMではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。