【プログラミングしてみよう9】Javaのポリモーフィズムで柔軟な処理を書く

Java

前回は継承を使って、Person クラスを引き継いだ Student クラスを作りました。

今回は、継承をさらに活用する「ポリモーフィズム(多態性)」について解説します。 ポリモーフィズムを使うことで、同じメソッド呼び出しでも、インスタンスの種類によって異なる動作をさせることができます。

ポリモーフィズムの基本

「ポリモーフィズム(多態性)」とは、同じメソッド名を呼び出しても、実際のインスタンスの種類によって動作が変わる仕組みのことです。子クラスで親クラスのメソッドを上書きすることを「オーバーライド」と呼び、ポリモーフィズムを実現するための重要な機能です。

@Override
戻り値の型 メソッド名(引数) {
    // 子クラス独自の処理
}

@Override は、このメソッドが親クラスのメソッドを上書きしていることを示す印です。書かなくても動作しますが、書いておくことでミスを防ぎやすくなるため、付けておくのがおすすめです。

サンプルコード(ポリモーフィズム)

ファイル作成

「Java02」フォルダに Teacher.javaPolymorphismTest.java という名前でファイルを作成します。前回作成した Person.javaStudent.java もそのまま使います。

コード入力

前回作った Student.java に、selfIntroduce メソッドを追加します。

public class Student extends Person {
    String school;

    @Override
    void selfIntroduce() {
        System.out.println("私は" + school + "の学生、" + name + "です。");
    }

    void study() {
        System.out.println(name + "は" + school + "で勉強しています。");
    }
}

新しく Teacher.java を作成し、以下のコードを入力します。

public class Teacher extends Person {
    String subject;

    @Override
    void selfIntroduce() {
        System.out.println("私は" + subject + "を教えている" + name + "です。");
    }
}

PolymorphismTest.java に以下のコードを入力します。

public class PolymorphismTest {
    public static void main(String[] args) {
        Person[] people = new Person[2];

        Student student = new Student();
        student.name = "ぱんまる";
        student.school = "パンマル大学";

        Teacher teacher = new Teacher();
        teacher.name = "たろう先生";
        teacher.subject = "数学";

        people[0] = student;
        people[1] = teacher;

        for (int i = 0; i < people.length; i++) {
            people[i].selfIntroduce();
        }
    }
}

コンパイル

javac Person.java Student.java Teacher.java PolymorphismTest.java

実行

java PolymorphismTest

実行結果は次のようになります。

私はパンマル大学の学生、ぱんまるです。
私は数学を教えているたろう先生です。

コードの解説

StudentTeacher は、どちらも Person クラスを継承していますが、それぞれ独自の selfIntroduce メソッドを @Override で定義し直しています。これにより、Person クラスにもともとあった selfIntroduce の内容が、子クラスごとに上書きされます。

注目したいのは Person[] people = new Person[2]; の部分です。親クラスである Person の型で配列を作っていますが、その中には Student のインスタンスと Teacher のインスタンスをどちらも入れることができます。これは、StudentTeacherPerson を継承しているため、Person の一種として扱えるからです。

people[i].selfIntroduce(); の部分では、配列の要素が Student のインスタンスであれば Student 用の自己紹介が、Teacher のインスタンスであれば Teacher 用の自己紹介が実行されます。呼び出しているコードはどちらも同じ selfIntroduce() ですが、実際のインスタンスの種類によって動作が変わっているのです。これがポリモーフィズムの大きな特徴です。

もしポリモーフィズムを使わず、Student 用と Teacher 用で別々の配列やメソッドを用意していたら、それぞれに対応するコードを個別に書く必要がありました。ポリモーフィズムを使うことで、種類の異なるオブジェクトをまとめて同じように扱えるようになります。

まとめ

ポリモーフィズムを使うことで、同じメソッド呼び出しでもインスタンスの種類に応じて異なる動作をさせることができます。子クラスでメソッドをオーバーライドし、親クラスの型でまとめて扱うことで、配列やループを使った処理がより柔軟になります。継承とポリモーフィズムは合わせて使うことでその効果を発揮するため、両方の仕組みをセットで覚えておくとよいでしょう。

2026/06/18(木) ぱんまる

コメント

タイトルとURLをコピーしました