2017-04-19 8 views
-1

の出力を説明してください誰も以下の質問への出力が「A.test」である理由を説明できますか?それはprivateあるのでjavaコード

class A { 

    private void test(){ 

     System.out.println("A.test"); 

    } 

    public void mytest(){ 

     this.test(); 

    } 

} 

class B extends A{ 

    protected void test(){ 

     System.out.println("B.test"); 

    } 

} 

public class Test{ 

    public static void main(String[] args) { 

     A a = new B(); 

     a.mytest(); 

    } 

} 
+1

ヒント:次回はお気に入りの検索エンジンを試してみてください;-) – GhostCat

答えて

2

クラスAtest()方法は、クラスBによってオーバーライドすることはできません。したがってthis.test();は、Bのインスタンスで実行されても、Atest()メソッドを呼び出します。

0

スーパークラスは、リフレクションを使用することなく、それらがオーバーライドある場合にのみthis以外の基準を使用することなく、型キャストを使用することなく、サブクラスのメソッドを呼び出すことができます。あなたのケースA a = new B();

Bの目的は、Bによって追加としてスーパークラスAなどprotected void test()によって継承されたような行動private void test()の両方を持っている作成されます。メソッドが両方とも存在するのは、acess修飾子がprivateであるために、メソッドがサブクラスのスコープに表示されないためです。したがって、オーバーライドできず、同じ名前のメソッドを追加するだけで別のメソッドが追加されます。

この場合、実行時多型性が存在しないため、コンパイル時間ターゲットメソッドが解決され、Aで定義されたメソッドが呼び出されます。

場合には、あなたはBmytestをオーバーライドしているだろうとオーバーライドmytestからあなたはBでメソッドが呼び出されていたであろう、その後testへの呼び出しを行っていた場合。 Bのどのメソッドもそのスーパークラスのメソッドを見ることができないので、これは理解しやすいです。