2016-04-23 11 views
0

私は継承について学びたいと思っています。私はこの問題に遭遇しました。ここで次のコードはなぜエラーを起こしますか?

はコードです:

import java.util.*; 
class Parent 
{ 
    void show() 
    { 
     System.out.println("show from parent"); 
    } 
} 
class Child extends Parent 
{ 
    public static void main(String s[]) 
    { 
     Parent p=new Child(); 
     p.show(); 
     p.display(); 
    } 
    void show() 
    { 
     System.out.println("show from child"); 
    } 
    void display() 
    { 
     System.out.println("display from child"); 
    } 
} 

とエラーは次のようになります。

G:\javap>javac Child.java 
Child.java:15: error: cannot find symbol 
       p.display(); 
       ^
    symbol: method display() 
    location: variable p of type Parent 
1 error 

私はshow()にアクセスすることができるよなら、なぜ私はdisplay()が継承されることを知っdisplay()にアクセスすることはできませんよまたていない親class.thaでChild class.

+0

'ディスプレイ()' – Li357

+0

がp' 'の基本型を参照してください...親クラスに存在しません。 – Satya

答えて

7

ランタイムタイプおよびコンパイル時のタイプはです。

実行時に変数pChildインスタンスへの参照を保持しています。したがって、showメソッドを呼び出すとChild#showにコードが実行されます。これはParent#showメソッドをオーバーライドするためです。

コンパイル時に、コンパイラはという変数の宣言されたについてのみ知ることができます。そして、これはParentです。したがって、コンパイラはタイプParentのフィールドとメソッドにアクセスできますが、タイプはChildではありません。

display方法は、単にそれゆえ、Parentでエラーが宣言されていません。

0

ディスプレイ()メソッドのクラス定義に存在しますtはエラーです。あなたはアクセス親クラスです。メソッドは子クラスではありません。子クラスでメソッドにアクセスしようとしています。子クラスのメソッドは必要ありません。

1

uは、クライアントの表示方法を呼び出したい場合、あなたは子クラスのオブジェクトを作成する必要がなければなりません。例えば、 。 子の子=新しい子();

それ以外の場合は、表示方法を親クラスに記述する必要があります。

ルールは、子の親クラスカントコールメンバーの参照です。

関連する問題