2017-01-18 6 views
-1
class A{ 

    void a(){ 
     System.out.println("hello a"); 
    } 
} 

class B extends A{ 

    void b(){ 

     System.out.println("hello b"); 
    } 
} 


public class test{ 

    public static void main(String[] args){ 

     A a= new B(); 
     a.b(); 

    } 
} 

子クラスでのアクセス方法へのできないこれは、コンパイルエラーを与えるものではありませんが、時間エラーを実行するが、私はオーバーライドと同じことを行うとき、それは私がその時それ、またclass A方法b()を定義している与えますClass Bのメソッドを実行しますが、その時点でメソッド名が異なる場合はclass Bのメソッドを実行できません。 説明してください。親クラス参照変数

+0

"これはコンパイルエラーが発生しません" - 不可能です。そのコードはコンパイルしてはいけません。コンパイルするコードが実行時に使用するコードと同じであることを確認してください。そして、オブジェクト指向プログラミングの基本についてお読みください。 – JimmyB

+0

あなたは継承について考えていますか?任意の本のどこにでも、親クラスのリファレンスが子クラスメソッドにアクセスできることが書かれていますか?笑。 –

答えて

0

実際にコンパイルエラーが発生するのは、クラスAにメソッドb()が存在しないため、メソッドバインディングがコンパイル時に参照のために行われるためです。クラスはこのメソッドを知らないのでなぜコンパイルエラー。

第2の 実行時にjdkがオブジェクトの型を知っているので、オブジェクトメソッドが呼び出されるため、クラスBのメソッドが呼び出されます。したがって、Bのメソッドが呼び出されます。

あなたは、クラスAに空白のメソッドボイドB()を追加することによって、コンパイルエラーを取り除くことができ

は、今クラスAは、B法(知っている)が、実行時のBのBの()が呼び出されます

class A{ 

    void a(){ 
     System.out.println("hello a"); 
    } 

    void b(){ 

    } 
} 

class B extends A{ 

    void b(){ 

     System.out.println("hello b"); 
    } 
} 


public class Test{ 

    public static void main(String[] args){ 

     A a= new B(); 
     a.b(); 

    } 
} 

コンパイルエラーをなくし、実行時エラーのみを取得するには、これを試してください

A b=new A(); 
((B)b).b(); 
関連する問題