2013-01-24 223 views
0

鑑於下面的代碼塊:繼承和私有方法

public class Trial { 
    public static void main (String[] args){ 
     B obj = new B(); 
     obj.doMethod(); #prints "From A". 
    } 
} 

class A { 
    private void method(){System.out.print("from A");} 
    public void doMethod(){method();} 
} 

class B extends A { 
    public void method(){System.out.print("from B");} 
    public void doMethod(){super.doMethod();} 
} 

事實證明,從類A中的方法()被調用。爲什麼是這樣?

回答

2

你明確地實現它的方式。從基類super呼叫的方法,其是A

public void doMethod(){super.doMethod();} 

所以方法鏈接是這樣的:

B.doMethod() -> A.doMethod() -> A.method() -> "from A" 
+0

對不起錯字。想問爲什麼來自類A的method()被調用。 –

+0

@VictorCheung,請參閱更新。 –

0

因爲,見下文:

class B extends A { 
    public void method(){System.out.print("from B");} 
    public void doMethod(){super.doMethod();} 
} 

在這裏,在B類的doMethod()你使用super.doMethod()來調用A類的doMethod()。所以顯然它是打印A類的doMethod()。

0

您撥打doMethod與超級關鍵字。它意味着它會調用父類的實現 更多關於super keyword

1

我覺得你的問題是,如果在class Aprivate void method(){System.out.print("from A");}是私有的,那麼爲什麼是印刷的「從」在class B

答案很簡單,你不能調用類的method()形成任何其他類。但是你可以用它自己的對象調用它。

當您撥打super.doMethod();時,其超級功能和method()是它自己的方法,因此它可以調用它。

0

您的代碼給出簡單對象創建(B OBJ =新B();),並使用超級呼叫。超級像其他人一樣使用父級。 ,這是更有趣,如果你嘗試類似(A = OBJ新B())事情會有所不同。

0

A類中的method()方法是私有的,私有方法不能被重寫。重寫時最好使用@Override annotion。

class B extends A { 

    @Override 
    public void method(){System.out.print("from B");} // Compile error 
} 

如果將方法更改爲靜態方法,會發生類似的情況。

class A { 
    public static void method(){System.out.print("from A");} 
} 

class B extends A { 
    public static void method(){System.out.print("from B");} 
}