2017-02-12 83 views

回答

7

A static和非static方法不能在相同的class中具有相同的名稱。這是因爲您可以使用引用訪問static和非static方法,編譯器將無法決定是否打算調用static方法或非static方法。

考慮下面的代碼,例如:

Ov ov = new Ov(); 
ov.fun(); //compiler doesn't know whether to call the static or the non static fun method. 

之所以爪哇可以允許使用參考是允許開發無縫改變static方法到非static方法被稱爲static方法。

2

我們必須編寫我們的代碼,以便語法正確。同樣重要的是理解我們的代碼不會給編譯器帶來任何歧義。如果我們有這樣的含糊之處,語言設計者已經注意不要讓這些代碼編譯。

一個類繼承其超類的行爲。靜態方法可以簡單地使用類名稱和實例來訪問。假設有一個具有相同名稱和簽名的方法(關鍵字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.** 
    } 
} 
+0

*可以使用實例*調用靜態方法。不。使用實例可以調用* Java *中的任何內容。 (至少不是程序員) – CKing

相關問題