有没有合理的理由为什么人们希望派生类能够覆盖隐藏基类的static
方法?
答案 0 :(得分:6)
除了术语外,Java中的静态方法确实有一种重写关系,二进制兼容性部分13.4.12暗示了这种关系。如果T扩展S,S声明m(),则T.m()可以引用T或S中的方法,具体取决于是否在T中声明了m();可以在T中添加或删除m(),而不会破坏任何调用T.m()的代码。 (这意味着JVM invokestatic指令执行一种动态方法查找超类链)
然而,这只不过是麻烦。如果T.m()的含义默默地改变是非常危险的,因为现在它指向一个不同的方法。 (实例方法应继承合同,这不是问题;静态方法中没有这样的理解。)
所以永远不要使用这个“特征”;该语言不应该以它开头。
好的做法:如果我们调用T.m(),m()必须在T中声明;如果不首先删除所有T.m(),就不应该从T中删除它。
答案 1 :(得分:4)
无法覆盖静态方法
为了覆盖方法,必须首先继承该方法。如果该方法未被继承,则无法覆盖。因此,您永远不能覆盖私有方法,因为它们不会被继承。