可能重复:
Why doesn't Java allow overriding of static methods?是否有任何合法的理由来隐藏静态方法?
有什么正当理由为何愿意派生类
覆盖
隐藏基类的static
方法?
可能重复:
Why doesn't Java allow overriding of static methods?是否有任何合法的理由来隐藏静态方法?
有什么正当理由为何愿意派生类
覆盖
隐藏基类的static
方法?
除了术语外,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()。
完全同意,他们不应该被使用。但是,它是*可能*。你能想到任何合法的现实世界的例子吗?在我的Java职业生涯中,我从未遇到过他们。 – BalusC
我从来没有遇到过它们,所以它一定是罕见的人“重写”静态方法。我想我第一次了解它时调查另一个棘手的问题http://stackoverflow.com/questions/6643648 – irreputable
+1的解释。但是,这正是我想知道为什么可能,如果这似乎不合逻辑(至少对我们大多数人)。 – Saket
静态方法不能被覆写
为了覆盖一个方法,该方法必须首先被继承。如果该方法没有被继承,那么就没有机会覆盖。因此,你永远不能重写一个私有方法,因为它们没有被继承。
它们不能被覆盖。他们可以隐藏。 – BalusC
看看这个主题 - http://stackoverflow.com/questions/2223386/why-doesnt-java-allow-overriding-of-static-methods – adatapost
@BususC语义...无论如何,我不认为任何人实际上回答了这个问题。 – NullUserException