Are there any legitimate reasons to hide static methods?
Possible Duplicate:
Why doesn't Java allow overriding of static methods?
号
是否有任何合理的理由要求派生类overridehide a staticmethod of the base class?
- 他们不能被凌驾。它们可以被隐藏。
- 看看这个线程-stackoverflow.com/questions/2223386/…
- @Balusc语义…不管怎样,我认为没有人真正回答过这个问题。
- …呃,这不是问题。我的理解是:如果可能的话,重写是否有意义?
- 为什么人们投票结束这个问题?重新阅读这个问题,与此无关(不管术语是否错误)
- @nulluserexception:请随意回答(注意:我没有投票支持close,这也超出了我的范围,这些问题肯定不一样,op只需要修正错误的术语,这也是我的评论的基本内容)
- @如果我能想出一个答案,我会的。
- @nullUserException:=)
- @NullUserException??-我将投票重新打开,以防它关闭以弥补错误的关闭投票:)
- 伙计们,也许这个问题的提出方式听起来不合适。但是,我理解它被称为"隐藏的"(感谢俾路支的纠正!)大于"overriden"。我真正想知道的是,与所考虑的dup问题不同的是,这样做的实际用例是什么(以及为什么语言允许这样做)。感谢@nue的澄清。
- 至于术语,请查看教程:download.oracle.com/javase/tutorial/java/iandi/override.html
- 顺便说一句:您可以使静态方法成为最终方法,这样派生方法就不能隐藏它。你会得到一个错误,比如m() in Main.B cannot override m() in Main.A; overridden method is static final。
型
除了术语,Java中的静态方法确实具有一种重写关系,由二进制兼容性部分(134.12)暗示。如果t扩展s,s声明的m(),t.m()可以引用t或s中的方法,这取决于m()是否在t中声明;并且可以在不破坏调用t.m()的任何代码的情况下从t中添加或删除m()。(这意味着jvm invokestatic指令执行某种动态方法查找超级类链)
然而,这只是麻烦。如果t.m()的意思悄悄地改变了,这是非常危险的,因为现在它指向了一个不同的方法。(实例方法应继承合同,这样就不会有问题;静态方法中没有这样的理解。)
所以这个"特性"不应该被使用;语言不应该让它从一开始。
好的做法是:如果我们调用t.m(),则必须在t中声明m();并且在不首先删除所有t.m()的情况下,永远不能从t中删除它。
- 完全同意不应使用它们。然而,这是可能的。你能想到任何合法的现实世界的例子吗?在我的Java职业生涯中,我从来没有遇到过他们。
- 我也从未遇到过它们,所以很少有人"重写"静态方法。我想我是在调查另一个棘手问题stackoverflow.com/questions/6643648时第一次了解到的。
- +1解释。但这正是我想知道的原因,如果这看起来不符合逻辑(至少对我们大多数人来说是这样)。
- @Saket的一些想法在一开始似乎很聪明,但所有的想法都必须经过时间的考验。在这种情况下,该功能显然没有通过测试;如果我们有时间机器,应该删除它。
- @Balusc:一个场景是,一个特定的类被证明是一个更一般的事物的特殊情况,因此它得到了一个新的、更抽象的超类,静态方法被移动到新的超类中,这样新的代码就可以在不引用的情况下访问它们,现在是一个特定的实现。旧代码仍然会找到该方法,但是,如果将存根方法保留在旧位置,委托给新的方法,则同样有效。
型
不能重写静态方法
为了重写方法,必须首先继承该方法。如果不继承该方法,则没有机会重写。因此,不能重写私有方法,因为它们不是继承的。