2012-05-04 53 views
2

我的問題來自一個項目。所以讓我抽象一些有點無關的細節。覆蓋一個受保護的方法,並嘗試從超類調用它

我有一個JAVA公共類A有兩個受保護的靜態方法,foo()和bar()。方法foo()在其正文中調用bar()。

public class A{ 
    protected static foo(){ 
    ... 
    bar() 
    ... 
    } 
    protected static bar(){print("A.bar()");} 

} 

現在我還具有延伸A.在乙類B,I重寫巴()

class B extends A{ 
    @Overrides 
    static protected bar(){ print("A.bar() extended"); 

} 

最後,我請從類FOO()在乙

class B extends A{ 
    ... 
    public static main(){foo()} 
} 

我無法理解兩點 1.編譯器(Eclipse)要求我刪除@Override註釋。爲什麼? 2.最後main()輸出「A.bar()」,這意味着已解析的bar()目標是A類的,但我打算重寫bar()並使用A的foo()來調用修改後的bar ()。我怎樣才能做到這一點?

您的意見是什麼?

回答

7
  1. 您不能覆蓋靜態方法。
  2. 由於每種方法都是靜態的,因此它們是靜態引用的。您首先撥打A.foo(),然後撥打A.bar()。由於您沒有實例,重寫方法不起作用。

您需要從您的代碼中刪除所有static,並在您的主目錄中使用new B().foo()

考慮閱讀這個tutorial

6

您不能覆蓋靜態方法,只能使用非靜態實例方法。你正試圖在靜態環境中使用繼承,而這是行不通的。如果你真的需要繼承(並且經常在你認爲自己確實需要的時候,確實不需要),那麼使得這些方法是非靜態的。

+2

對於任何人投票給我,我已經達到我的投票最高的一天。請投票@紀堯姆的類似答案(我已經完成了)。 :) –

+0

嘿,謝謝;-) –

相關問題