我們必須編寫我們的代碼,以便語法正確。同樣重要的是理解我們的代碼不會給編譯器帶來任何歧義。如果我們有這樣的含糊之處,語言設計者已經注意不要讓這些代碼編譯。
一個類繼承其超類的行爲。靜態方法可以簡單地使用類名稱和實例來訪問。假設有一個具有相同名稱和簽名的方法(關鍵字static
除外),調用實例上的方法將使編譯器停止投擲。它將如何決定程序員意圖去做什麼,以及他或她想要調用的兩種方法?因此,語言設計者決定讓這種情況導致編譯錯誤。
作爲每
http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.2
如果C類聲明或繼承的靜態方法m,則m爲所述隱藏任何方法M」,其中,m的簽名是一個子簽名(§8.4.2)中的C的超類和超接口中的m'的簽名,否則C中的代碼可以訪問它。 如果靜態方法隱藏實例方法,則會出現編譯時錯誤。
public class Ov extends Am implements Inter {
public static void main(String[] args) {
Ov.fun(); //static method is intended to call, fun is allowed to be invoked from sub class.
Ov obj = new Ov();
obj.fun(); //** now this is ambiguity, static method can
//be invoked using an instance, but as there is
//an instance method also hence this line is ambiguous and hence this scenario results in compile time error.**
}
}
有什麼問題嗎? – shmosel