🎯

【Java】クラス解説19・動的メソッドディスパッチ1

2024/01/18に公開

ポリモーフィズムの3要素について

ポリモーフィズムは、以下の3要素から成ります。

  1. メソッドのオーバーロード

参考記事

https://zenn.dev/goriki/articles/005-about-methods

  1. メソッドのオーバーライド

参考記事

https://zenn.dev/goriki/articles/019-over-ride

  1. 動的メソッドディスパッチ
    下記のコード例を参考にして、動的メソッドディスパッチについて解説します。

動的メソッドディスパッチ1のコード例

public class Main {
    public static void main(String[] args) {
        // アップキャスト
        MyClass obj1 = new Fuzi();
        MyClass obj2 = new Sakura();
        // 動的メソッドディスパッチ
        obj1.print(); // 出力結果 -> fuzi
        obj2.print(); // 出力結果 -> sakura
    }
}
// スーパークラスMyClassを定義
class MyClass {
    public void print() {
        System.out.println("MyClass");
    }
}
// サブクラスFuziを定義
class Fuzi extends MyClass{
    // printメソッドをオーバーライド
    public void print() {
        System.out.println("fuzi");
    }
}
// サブクラスSakuraを定義
class Sakura extends MyClass{
    // printメソッドをオーバーライド
    public void print() {
        System.out.println("sakura");
    }
}

コード例の解説

class MyClass {
    public void print() {
        System.out.println("MyClass");
    }
}

スーパークラスのMyClassを定義して、

  1. printメソッドを定義して、
  2. 処理内容は、標準出力にMyClassを出力します。

class Fuzi extends MyClass{
    public void print() {
        System.out.println("fuzi");
    }
}

MyClassを継承したサブクラスFuziを定義して、

  1. スーパークラスのprintメソッドをオーバーライドして、
  2. 処理内容は、標準出力にfuziを出力するよう上書きします。

class Sakura extends MyClass{
    public void print() {
        System.out.println("sakura");
    }
}

MyClassを継承したサブクラスSakuraを定義して、

  1. スーパークラスのprintメソッドをオーバーライドして、
  2. 処理内容は、標準出力にsakuraを出力するよう上書きします。

public class Main {
    public static void main(String[] args) {
        MyClass obj1 = new Fuzi();
        MyClass obj2 = new Sakura();
        obj1.print(); // 出力結果 -> fuzi
        obj2.print(); // 出力結果 -> sakura
    }
}

Mainクラスで、

  1. アップキャストを行い、MyClass型の変数obj1に、サブクラスFuziのインスタンスを代入します。
  2. アップキャストを行い、MyClass型の変数obj2に、サブクラスSakuraのインスタンスを代入します。
  3. サブクラスFuziのインスタンスが代入された変数obj1からprintメソッドを呼び出すと、オーバーライドしたfuziクラスのprintメソッドが呼び出され、出力結果がfuziとなります。
  4. サブクラスSakuraのインスタンスが代入された変数obj2からprintメソッドを呼び出すと、オーバーライドしたfuziクラスのprintメソッドが呼び出され、出力結果がsakuraとなります。

まとめ

上記のobj1.print()obj2.print()が動的メソッドディスパッチです。繰り返しになりますが、obj1.print()では、Fuziクラスのインスタンスからprintメソッドを呼び出すと、複数あるprintメソッドの中からFuziクラスのprintメソッドが呼び出されます。このように、それぞれのインスタンスのクラスに基づいて適切なメソッドが呼び出されることを動的メソッドディスパッチと言います。

Discussion