オブジェクト型のキャストについて
現在Java silverを学習中で、オブジェクト型のキャストについて詰まってしまったので
知識を拝借させていただきたくご質問いたします。
クラスをインスタンス化する際に、スーパクラスの型で、サブクラスのインスタンスを生成し、
サブクラスのメソッドをコールする場合,ダウンキャストをしなければコンパイルエラーが発生
するというのは、理解ができました。
しかし、下記のコードのようにサブクラスにて、スーパクラスのメソッドをオーバライドした場合
は、ダウンキャストせずとも、コンパイルが成功しました。
なぜコンパイルが成功したのかが、理解できず、ご質問させていただきました。
該当のソースコード
java
11class Main { 22 public static void main(String[] args) { 33 Sample obj = new Test(); //スーパクラス型でサブクラスのインスタンスを生成 44 obj.print(); //サブクラスでオーバライドしたメソッドをコール 55 } 66} 7 87class Sample { // スーパクラス 98 public void print() { 109 System.out.println("スーパクラスのメソッド"); 1110 } 1211} 13 1412class Test extends Sample { // サブクラス 1513 public void print() { // スーパクラスのメソッドをオーバライド 1614 System.out.println("サブクラスのメソッド"); 1715 } 1816}
上記コードの8〜10行目を削除して実行すると、コンパイルエラーになります。
※ダウンキャストすれば実行可能です。
私の現時点の知識だと、上記のコードはサブクラスのprintメソッドを実行しており、インスタンスは
スーパクラスなため、ダウンキャストしない限りコンパイルエラーになると思ったのですが、、、、
オーバライドをすると、実装先はオーバライドを記述したサブクラスではなく、スーパクラスになったり
するのでしょうか?
※スーパクラスに実装になれば、コンパイルエラーにならないのも納得ができます。
スーパクラス型でサブクラスのインスタンスを生成した場合の、メソッドコールについて、オーバライド
をした場合、サブクラスのメソッドをダウンキャスト無しでコールしてもコンパイルエラーにならない理由
をご教授いただけると嬉しいです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/02 12:12