2013-05-31 63 views
7
class Parent 
{ 
    private void method1() 
    { 
     System.out.println("Parent's method1()"); 
    } 
    public void method2() 
    { 
     System.out.println("Parent's method2()"); 
     method1(); 
    } 
} 
class Child extends Parent 
{ 
    public void method1() 
    { 
     System.out.println("Child's method1()");   
    } 

    public static void main(String args[]) 
    { 
     Child p = new Child(); 
     p.method2(); 
    } 
} 

ANS是爲什麼繼承輸出是意外

Parent's method2() 
Parent's method1() 

如果我創建子類,那麼爲什麼輸出是父類方法的對象? 甚至method1在父項中是私有的。它搖動我的所有繼承概念。

回答

13

如果覆蓋父方法,它會調用子方法。但它不,因爲父方法是私有的,因此不能被覆蓋。

當你的目的是要覆蓋從父類或接口的方法,你應該總是與@Override註釋方法。如果你這樣做,在這種情況下,你會從編譯器中得到一個錯誤,因爲孩子的方法1沒有覆蓋任何方法。

當父類被編譯,編譯器會在父類的方法1。它發現它,並認爲它是私人的。由於它是私有的,它知道它不能被任何子類覆蓋,因此靜態地將方法調用綁定到它找到的私有方法。

如果方法1是受保護或公開,編譯器會找到方法,並知道該方法可以由子類覆蓋。所以它不會靜態地綁定到該方法。相反,它會生成字節碼,在運行時在具體類中查找method1,然後獲得您期望的行爲。

想想看:如果一個子類可以覆蓋一個私有方法,該方法不會是私人了。

+0

是的,我知道它。但是IM製作子類的對象。 –

+0

@ankitagahoi我在你的聲明中看不到「but」的意思:) –

+0

如果這是子類對象和具有method1的子類,那麼它不是重寫的情況。 Child p = new Child(); –

1

私人成員不被子類繼承。因此,您只需在子類中定義完全獨立的public void method1。當然,它不參與動態調度。

2

默認情況下,子類將有權訪問父方法。您呼叫p.method2()...所以它是從父執行不以兒童類存在...

雖然方法1()是私有的父母。它是從當地的方法,即所謂的方法2()...所以方法1()得到了無障礙的方法2()....