2012-08-05 136 views
3

我知道這是一個相當毆打的話題,但有些東西我需要澄清,請耐心等待一分鐘。靜態方法重新定義規則

靜態方法被繼承,就像任何其他的方式,按照有關訪問修飾符相同的繼承規則(私有方法是不能繼承等)

靜態方法是不要過度纏身,他們被重新定義。如果一個子類定義了一個與超類相同的簽名的靜態方法,那麼它被稱爲隱藏或隱藏了超類的版本,因爲它們不是實例方法的多態。

重新定義的靜態方法似乎仍然遵循一些(如果不是全部的話)規則。

首先,重新定義的靜態方法不能是多個接入限制比超類的靜態方法。爲什麼??

其次,返回類型也必須兼容超類和子類的方法。例如:

class Test2 { 
    static void show() { 
     System.out.println("Test2 static show"); 
    } 
} 

public class StaticTest extends Test2 { 
    static StaticTest show() { 
     System.out.println("StaticTest static show"); 
     return new StaticTest(); 
    } 

    public static void main(String[] args) { 
    } 

} 

在蝕它示出了在在線的錯誤: The return type is incompatible with Test2.show() 爲什麼?

第三,是否有任何其他規則在重新定義靜態方法時遵循,這些靜態方法與上乘規則相同,這些規則的原因是什麼?

Thanx提前!!

回答

7

隱藏靜態方法的要求在§8.4.8.3 of the Java Language Specification中詳細說明。總的來說,這是一樣的實例方法:

  1. 的隱藏方法(在子類)的返回類型必須是賦值兼容的隱藏方法的返回類型(在超類)。
  2. 隱藏方法的訪問修飾符不能超過隱藏方法的限制。
  3. 它是在T類中的方法m具有相同簽名擦除作爲另一種方法n是在T訪問,除非m擦除的簽名是方法n的子簽名後一個錯誤。
  4. throws對隱藏,覆蓋或實現聲明爲拋出檢查異常的其他方法的方法有一些限制。 (基本上,不能聲明隱藏方法拋出未在隱藏/覆蓋/實現方法中聲明的已檢查異常。)

我認爲就是這樣,但請參閱JLS以獲取更多詳細信息。 JLS沒有解釋這些規則的基本原理,但其中大部分似乎是爲了防止多態性問題。您希望子類在任何使用父類的地方都可用。

+0

打我吧。我將留下我的答案作爲評論:簡而言之,Java不允許定義方法,這會導致調用哪個方法時出現歧義。在你的例子中,我懷疑編譯器抱怨,因爲StaticTest.show()會不明確。 – CurtainDog 2012-08-05 08:06:43