2017-04-19 78 views
-1

任何人都可以解釋爲什麼輸出到下面的問題是「A.test」嗎?解釋下面的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

A類的test()方法不能由B類重寫,因爲它是private。因此,this.test();調用Atest()方法,即使它在類B的實例上執行。

0

超級類可以調用子類的方法,而無需使用類型轉換,而無需使用反射,並且不使用比其他this參考僅當它們是重寫

在你的情況A a = new B();B對象被創建同時具有作爲繼承了超類A以及protected void test()通過B作爲添加的行爲private void test()。這兩種方法存在的原因並不僅僅是因爲接口修飾符是private,所以該方法在子類作用域中不可見。因此它不能重寫和添加具有相同名稱的方法只是簡單地添加另一種方法。

由於在這種情況下沒有運行時多態性因此編譯時目標方法已解決,並調用A中定義的方法。

如果萬一你會在B已經重寫了mytest,並從被覆蓋的mytest你會作出然後在B方法會被調用來test通話。這很容易理解,因爲B的任何方法都看不到其超類的任何private方法。