2015-11-29 42 views
1
class Base { 
    private void SayHello(){ //PRIVATE 
     System.out.println("Hello from Base"); 
    } 
} 

class Derived extends Base { 
    public void sayHello(){ //PUBLIC 
     System.out.println("Hello from Derived"); 
    } 
} 

public class TestHello{ 

    public static void main(String[] args) { 
     Derived d = new Derived(); 
     Base b = d; 

     d.sayHello(); //works as expected 
     b.sayHello(); //Why does this not work? 
    } 
} 

我想明白:是私人sayHello從基類可見到派生類?還是重新定義?爲什麼從基指針調用派生sayHello不起作用?我的意思是,如果它是公開的(在Base中),那麼來自派生類的sayHello就會被調用。所以,我不明白的是,如果它必須從派生類調用公共sayHello,那麼爲什麼要從基類中查看訪問修飾符?另外,如果你能指點我一些簡潔的資源,這將有助於我更深入地理解這一點,我真的很感激這一點。謝謝!動態綁定如何在Java中的基類中爲私有方法工作?

+0

當您在覆蓋父項目實施的子類中提供實例方法時,將調用此方法,而不是父項。 –

回答

1

是從基類可見到派生類的私人sayHello?

當然,不,因爲它有private訪問修飾符。

更多關於訪問修飾符:

Controlling Access to Members of a Class

or is it a redefinition? 

正如你可以接受的答案看這個問題:

What's the difference between redefining a method and overriding a method?

術語 「重新定義」 不常用。我們可以談論「重寫」和「超載」,但在你的情況下,DerivedsayHello是一種新方法,它不是Base類的sayHello的重載版本。

爲什麼從基址指針 派生sayHello的調用不起作用?

只是因爲你試圖調用不屬於開放類接口的方法。

我的意思是,如果它是公開的(在基地),那麼從 派生類sayHello將被調用。

當然,這是一個預期的多態行爲。在這種情況下,Derived類中的sayHello將從Base類中覆蓋sayHello,因此您可以通過Base類的引用從Derived類調​​用sayHello

所以,我無法理解的是,如果它具有從派生類中調用公共 sayHello的,那麼爲什麼看從基類的訪問修飾符 ?

由於您使用參考Base類,並有一個在Base類的接口沒有sayHello方法。

我找到了一個很好的討論在這裏:

Overriding private methods in Java

也可以對您有用:

Overriding and Hiding Methods

希望它會幫助你。

+0

謝謝你這樣明確的答案! –

0

b.sayHello()不起作用,因爲當你調用方法sayHello()時,計算機開始在基類中尋找方法,並且當它找到方法時,它會看到它是一個私有方法,所以它會告訴你,你不能使用它。

另一方面,d.sayHello()正在工作,因爲計算機將開始在派生的子類中尋找sayHello(),並且當計算機發現它時,它會讓您使用它,因爲它是公共的。

1

由於下面簡單地將線路分配爲對象Derived

Base b = d; 

的可變參考和private方法是私有的目的和不是類的外部可見。

相關問題