🎯

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

2024/01/18に公開

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

public class Main {
    public static void main(String[] args) {
        // アップキャスト
        Myclass obj1 = new Fuzi();
        MyClass obj2 = new Sakura();
        // 動的メソッドディスパッチ
        callPrint(obj1); // 出力結果 -> fuzi
        callPrint(obj2); // 出力結果 -> sakura
    }
    // Myclass型の仮引数objのcallPrintメソッドを定義します。
    private static void callPrint(MyClass obj) {
        // 仮引数objからprintメソッドを呼び出し
        obj.print();
    }
}
// スーパークラス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();
        callPrint(obj1); // 出力結果 -> fuzi
        callPrint(obj2); // 出力結果 -> sakura
    }
    private static void callPrint(MyClass obj) {
        obj.print();
    }
}

Mainクラスで、

  1. アップキャストを行い、変数obj1にFuziクラスのインスタンスを代入します。
  2. アップキャストを行い、変数obj2にSakuraクラスのインスタンスを代入します。
  3. 実引数でFuziクラスのインスタンスを渡す、callPrintメソッドを呼び出します。
  4. 実引数でSakuraクラスのインスタンスを渡す、callPrintメソッドを呼び出します。
  5. スーパークラス型の仮引数objで各サブクラスのインスタンスを受け取る、callPrintメソッドを定義します。
  6. その処理内容として、受け取った各サブクラスのインスタンスでprintメソッドを呼び出すと、各インスタンスに応じたprintメソッドが呼びされます。

まとめ

1つ前の記事では、下記の通りサブクラスのインスタンスが代入された変数からメソッドを呼び出しました。

obj1.print();

今回は、下記の通りサブクラスのインスタンスが入っている引数やオブジェクトからメソッドを呼び出しました。

callPrint(obj1); // 実引数

obj.print(); // オブジェクト

どちらもインスタンスのクラスに応じた適切なメソッドが呼び出される動的メソッドディスパッチが確認されました。

Discussion