2011-09-23 54 views
6

可能重複:
Why doesn't Java allow overriding of static methods?是否有任何合法的理由來隱藏靜態方法?

有什麼正當理由爲何願意派生類 覆蓋 隱藏基類的static方法?

+5

它們不能被覆蓋。他們可以隱藏。 – BalusC

+0

看看這個主題 - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost

+0

@BususC語義...無論如何,我不認爲任何人實際上回答了這個問題。 – NullUserException

回答

6

除了術語外,Java中的靜態方法確實有一種重載關係,由二進制兼容性部分13.4.12提供。如果T擴展S,S聲明爲m(),則T.m()可以引用T或S中的方法,具體取決於m是否在T中聲明;並且可以從T中添加或刪除m(),而不會破壞任何調用T.m()的代碼。 (這意味着JVM invokestatic指令可以查找超級鏈中的某種動態方法)

但是,這只是麻煩。如果T.m()的含義默默地改變了,因爲它現在指向了一種不同的方法,這是非常危險的。 (實例方法應該繼承合約,所以這不是問題;在靜態方法中沒有這樣的理解。)因此,這個「特徵」不應該被使用;但是,這個特徵不應該被使用。該語言不應該啓用它。好的做法:如果我們調用T.m(),m()必須在T中聲明;並且它不應該從T中刪除,而不要先刪除所有T.m()。

+0

完全同意,他們不應該被使用。但是,它是*可能*。你能想到任何合法的現實世界的例子嗎?在我的Java職業生涯中,我從未遇到過他們。 – BalusC

+0

我從來沒有遇到過它們,所以它一定是罕見的人「重寫」靜態方法。我想我第一次瞭解它時調查另一個棘手的問題http://stackoverflow.com/questions/6643648 – irreputable

+0

+1的解釋。但是,這正是我想知道爲什麼可能,如果這似乎不合邏輯(至少對我們大多數人)。 – Saket

4

靜態方法不能被覆寫

爲了覆蓋一個方法,該方法必須首先被繼承。如果該方法沒有被繼承,那麼就沒有機會覆蓋。因此,你永遠不能重寫一個私有方法,因爲它們沒有被繼承。

相關問題