Java-ポリモーフィズム

ポリモーフィズム(polymorphism)

Javaにおけるポリモーフィズムとは、類似したクラスのメソッドの呼び出し方を共通にする仕組みを指します。

つまり、同じメッセージを送信した際に、メッセージを受け取ったインスタンスが、そのクラスによって違う振る舞いをすることです。

ポリモーフィズムは、同じメソッド名で場面に応じた動作をさせることができるため、オブジェクトを呼び出す側が意識しなくても実行時の条件に合った適切なメソッドが実行できるようになります。


ポリモーフィズムとは、ギリシア語で「多数の形態」という意味です。

プログラミングの世界では、多態性、多様性、多相性などと訳されます。


ポリモーフィズムのサンプル


class SuperClass
{
    // numで指定したインスタンスを生成します。
    public SuperClass getInstance(int num)
    {
        switch (num) {
        case 1:
            return new SubClass1();
        case 2:
            return new SubClass2();
        default:
            return null;
        }
    }

    void description(){
        System.out.println("SuperClass");
    }
}

class SubClass1 extends SuperClass
{
    void description(){
        System.out.println("SubClass1");
    }
}

class SubClass2 extends SuperClass
{
    void description(){
        System.out.println("SubClass2");
    }
}

class Polymorphism
{
    public static void main(String[] args)
    {
        SuperClass sp = new SuperClass();
        sp.description(); //SuperClass

        SuperClass sub1 = sp.getInstance(1);
        sub1.description(); //SubClass1

        SuperClass sub2 = sp.getInstance(2);
        sub2.description(); //SubClass2
    }
}

アップキャストとダウンキャスト

アップキャストとは、サブクラスをスーパークラスの型で扱うことです。


SuperClass obj = new SubClass();

ダウンキャストとは、スーパークラスからサブクラスへとキャストすることです。


SubClass objSub = (SubClass)objSuper;

抽象(abstract)クラス

抽象クラスを作成することで、ポリモーフィズムを強制させることができます。

抽象クラスを継承したクラスでは、抽象メソッドの具体的な処理を記述しなければコンパイルエラーを発生させます。


//抽象クラス
abstract class AbstractSuperClass
{
    //抽象メソッド
    abstract void method();
}

オーバーロード(overload)

Javaでは、ポリモーフィズムによって、引数が異なれば同じ名前のメソッドを複数定義することができます。

同じ名前のメソッド(やコンストラクタ)を作ることを、「メソッドをオーバーロードする」と言います。


class Overload{
    void method(String name, String country) {
        System.out.println(name + country);
    }

    void method(String name) {
        System.out.println(name);
    }

    public static void main(String[] args) {
        Overload obj = new Overload();
        obj.method("load");
        obj.method("over", "load");
    }
}

関連ページ