🎯

【Java】クラス解説23・ポリモーフィズムで出来ないこと

2024/01/23に公開

ポリモーフィズムで出来ないこと

結論から言うと、スーパークラスで定義されていないメソッドやフィールドは、ポリモーフィズムを利用しようとしてもエラーになります。

コード例

public class Main {
    public static void main(String[] args) {
        MyClass obj = new Fuzi();
        obj.name = "fuzi"; // 出力結果 -> コンパイルエラー
        obj.printName(); // 出力結果 -> コンパイルエラー
    }
}
// スーパークラスMyClassを定義
class MyClass {
    public void print() {
        System.out.println("MyClass");
    }
}
// サブクラスFuziを定義
class Fuzi extends MyClass{
    // フィールドnameを定義
    public String name;
    // printNameメソッドを定義
    public void printName() {
        System.out.println("fuzi");
    }
}

コード例の解説

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

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

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

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

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

  1. nameフィールドを定義します。
  2. printNameメソッドを定義して、
  3. 処理内容は、標準出力にfuziを出力します。

public class Main {
    public static void main(String[] args) {
        MyClass obj = new Fuzi();
        obj.name = "fuzi";
        obj.printName();
    }
}

Mainクラスで、

  1. アップキャストを行います。
  2. サブクラスのインスタンスが代入されたMyClass型の変数objが、サブクラスのnameフィールドにアクセスしようとしますが、コンパイルエラーになります。
  3. サブクラスのインスタンスが代入されたMyClass型の変数objが、サブクラスのprintNameメソッドにアクセスしようとしますが、コンパイルエラーになります。

コンパイルエラーの理由

なぜサブクラスのインスタンスが代入された変数objがサブクラスのフィールドやメソッドにアクセスできないのか? その理由については、変数objの型はスーパークラスのMyClass型であるため、変数objは当然スーパークラスにアクセスしますが、そこにnameフィールドやprintNameメソッドがないため、コンパイルエラーとなるのです。


ポリモーフィズムの一連の流れについて

ポリモーフィズムの一連の流れは下図のようになります。

Discussion