2012-04-24 60 views
3

它無處不在,靜態方法不能被重寫,但是當我試圖減少訪問說明符說從公共保護它會給出一個錯誤。例如在java中靜態方法重載的奇怪例子

public class StaticOverrideFunda { 

    public static void foo(){ 
     System.out.println("Parent Foo"); 
    } 
} 

public class B extends StaticOverrideFunda{ 


    protected static void foo(){ 
     System.out.println("Child Foo"); 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     // TODO Auto-generated method stub 
     B.foo();    
    } 
} 

它說

不能減少繼承的方法

這樣的知名度INSENSE它是繼壓倒一切的規則,爲什麼我們要說富沒有被覆蓋在B班?爲什麼我們說這是隱藏/遮蔽而不是壓倒一切?

+4

「它遵循最重要的規則」:錯誤。它打破了「不能降低繼承方法的可見性」條款。你的問題到底是什麼? – Viruzzo 2012-04-24 11:52:48

回答

8

它下面一些相同的規則作爲壓倒一切的,但是,這並不意味着它是壓倒一切的。在這種情況下,它是「在重寫和隱藏要求」 section 8.4.8.3 of the JLS規則,:

訪問修飾符(6.6節)壓倒一切的或隱藏的方法必須至少提供儘可能多的訪問,因爲重寫或隱藏的方法如下:[...]

它仍然不重寫,因爲該方法不會被調用多態 - 你不能寫一個通話將有時最終調用StaticOverrideFunda.foo有時最後叫B.foo;目標完全是在編譯時確定的。

值得回顧8.4.8節的其餘部分,其中定義爲作爲在實例方法上發生的事情而被重寫。

+2

嗯,這對我來說是一個驚喜。不允許隱藏方法比隱藏方法具有更少的可見性有什麼意義?這對於可以多態調用的方法來說是有意義的,因爲任何可以調用超類方法的東西都必須被允許調用子類。但是,隱藏而不是覆蓋的靜態方法並非如此。 – Wyzard 2012-04-24 11:59:23

+1

@Wyzard:我同意禁止降低能見度有點奇怪。然而,它有可能試圖避免出現明確調用Subclass.foo()這種私有方法的情況,該方法通常會解析爲「Superclass.foo()」。無論哪種方式,它的行爲都完全按照JLS來進行,而且還沒有壓倒一切。老實說,我建議不要在與子類靜態方法同名的子類中聲明一個靜態方法。這隻會導致混亂。 – 2012-04-24 12:03:40

-1

你自己在你的問題中發佈了答案,覆蓋意味着在相同方法的子類中有不同的代碼。由於無法重寫靜態方法,因此無法通過修改訪問說明符來使用可見性。