2015-12-18 107 views
5

當隱藏一個靜態字段時,對該字段在子類中的訪問級別沒有限制,它甚至可以是非靜態的和其他數據類型。爲什麼Java限制隱藏方法的訪問修飾符

另一方面,隱藏靜態方法時,從隱藏靜態方法的超類的子類的靜態方法可以允許比隱藏方法更多(但不少於)的訪問。 AFAIK,靜態方法鏈接無論如何都是在編譯時完成的,那麼爲什麼會有這樣的限制呢?

P.S.這個問題只是出於好奇。

+4

Jon的懷疑(我沒不要把它標爲重複的,因爲答案只是基於JLS確認它,而你的問題更多地是關於爲什麼JLS是這樣設計的):http://stackoverflow.com/questions/26963828/reducing-the-visibility-of-a -static-方法。關於字段:它們不是多態的(不管它們是否是靜態的,所以沒有限制它們變化的範圍)。 – Pshemo

+1

首選您的文章預編輯 –

+2

恢復到預先編輯的狀態。只是不希望人們將問題理解爲「爲什麼允許字段是允許的,而且方法不是」。 – Bax

回答

-2

因爲在子類中,你重寫了非私有超類方法但是影子字段。至於設置更廣泛的訪問級別 - 你總是可以像

public void sublcassMethod() { 
    supersecretSuperclassMethod(); 
} 

所以是沒有意義的,限制與在語言層面更廣泛的接入覆蓋寫的東西 - 這樣的限制可以很容易犯

+0

問題是關於靜態方法。 – chrylis

+0

是的,我知道。但在這種情況下的日食會告訴我們「 - 不能減少從超類繼承的方法的可見性」。所以我認爲,不管靜態還是非靜態方法,繼承機制都是一樣的。 –

+0

不要忘記你可以在對象上調用靜態方法。所以我認爲要省略哪些靜態方法調用的誤解,在Java靜態和非靜態方法中有相同的繼承機制。 –

相關問題