2011-09-23 53 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

静态方法不能被覆写

为了覆盖一个方法,该方法必须首先被继承。如果该方法没有被继承,那么就没有机会覆盖。因此,你永远不能重写一个私有方法,因为它们没有被继承。

相关问题