2014-12-29 40 views
1

我有以下類別:哪些Java方法將被調用(繼承,沒有@Override)

Class X 
{ 
    void f() { ... } 
} 

Class Y extends X 
{ 
    void f() {....} 
} 

Class Z extends Y 
{ 
    // No void f() method declared here 
} 

Z原因Y.f()的對象上調用f()執行。我期望X.f()將被執行,因爲Y.f()沒有@Override註釋。

我的問題:最具體的方法是否會被執行,或者是什麼原因導致這種行爲?

謝謝!

+0

Java中的所有可繼承的實例方法都是虛擬的。重寫是唯一的選擇。 –

回答

3

@Override註釋是可選的。爲了使子類的方法覆蓋具有相同簽名的基類的方法,不需要使用它。

使用@Override註釋只是有助於發現錯別字。例如,如果重寫方法沒有它應該覆蓋的方法的確切名稱,編譯器會抱怨說沒有匹配的方法可以覆蓋。沒有註解,編譯器不知道你打算覆蓋基類方法。

所以,是的,最具體的方法將總是被執行,只要它有足夠的訪問級別(在你的榜樣,如果Yf()是私人的,Xf()將轉而執行)。

0

是的,如果沒有特定的標籤覆蓋所有你會做的是創造一種新的方法