🎯
【Java】クラス解説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を定義して、
- printメソッドを定義して、
- 処理内容は、標準出力に
MyClass
を出力します。
class Fuzi extends MyClass{
public String name;
public void printName() {
System.out.println("fuzi");
}
}
MyClassを継承したサブクラスFuziを定義して、
- nameフィールドを定義します。
- printNameメソッドを定義して、
- 処理内容は、標準出力に
fuzi
を出力します。
public class Main {
public static void main(String[] args) {
MyClass obj = new Fuzi();
obj.name = "fuzi";
obj.printName();
}
}
Mainクラスで、
- アップキャストを行います。
- サブクラスのインスタンスが代入されたMyClass型の変数objが、サブクラスのnameフィールドにアクセスしようとしますが、コンパイルエラーになります。
- サブクラスのインスタンスが代入されたMyClass型の変数objが、サブクラスのprintNameメソッドにアクセスしようとしますが、コンパイルエラーになります。
コンパイルエラーの理由
なぜサブクラスのインスタンスが代入された変数objがサブクラスのフィールドやメソッドにアクセスできないのか? その理由については、変数objの型はスーパークラスのMyClass型であるため、変数objは当然スーパークラスにアクセスしますが、そこにnameフィールドやprintNameメソッドがないため、コンパイルエラーとなるのです。
ポリモーフィズムの一連の流れについて
ポリモーフィズムの一連の流れは下図のようになります。
Discussion