2017-07-10 3 views
-4

以下に、多型の例を示します。コンパイラはおよそdp.consume()を不平を言う理由スーパークラス参照変数を使用してサブクラスの新しいメソッドにアクセスできない理由

package tsys; 

public class DynamicPolymorphism { 
    public void eat(){ 
     System.out.println("DynamicPolymorphism"); 
    } 
} 
class AnotherClass extends DynamicPolymorphism{ 
    public void eat(){ 
     System.out.println("Another Class"); 
    } 
    public void consume(){ 
     System.out.println("consume"); 
    } 
} 
class TestPolymorphism{ 
    public static void main(String args[]){ 
     DynamicPolymorphism dp = new AnotherClass(); 
     dp.eat();//Works fine 
     dp.consume();//compile time error 
    } 
} 

今の質問はありますか?この質問はインタビューで私に聞かれました。私はその理由を と説明しました。 "コンパイル時コンパイラはdpのタイプが参照のタイプについてDynamicPolymorphismであることを知っているので、コンパイラはconsumeメソッドを見つけることができません。

私の答えは、コンパイラがエラーを与えるシーンの裏で何が起こるかを尋ねましたが、変数dpAnotherClassのインスタンスに参照しています。

私はカウンターの質問に対して面接官を説明できますか?

+1

Downvoters、私が改善できるように、何が間違っているのか説明できますか? –

+1

私はカウンターの質問を理解していないので、私は説明を求めていたでしょう。 「舞台裏」はありません。コンパイラは 'dp'が' DynamicPolymorphism'であることを知っているので、 'DynamicPolymorphism'で宣言されたメソッドへの呼び出しだけを知ることができます。基本的にあなたが言ったこと。これは、Javaのような[静的型付けされた](https://stackoverflow.com/q/1517582/5221149)言語の基本的性質です。 – Andreas

+0

@Andreasあなたの答えは適切です、私はただここを見ています。多形性に関して私が見逃したことはありますか?おかげで –

答えて

-2

dpがDynamicPolymorphismと宣言されています。したがってAnotherClassのメソッドについては何も知らない。消費を呼び出す場合は、型キャストして消費する必要があります。 try((AnotherClass)dp).cosume()

+0

OPはすでにこれを認識しています。質問全体をお読みください。 –

+0

DynamicPolymorphismクラスの契約に従って、eatだけが表示されます。したがって、型変換は、コンパイル時に消費するために必要です。 – PrashanthBC

関連する問題