有没有合理的理由隐藏静态方法?

Sak*_*ket 6 java static method-hiding

可能重复:
为什么Java不允许覆盖静态方法?

有没有合理的理由为什么人们希望派生类重写隐藏static基类的方法?

irr*_*ble 6

除了术语之外,Java中的静态方法确实具有一种重写关系,二进制兼容性部分13.4.12暗示了这种关系.如果T扩展S,S声明m(),Tm()可以引用T或S中的方法,这取决于是否在T中声明了m(); 并且可以在T中添加或删除m(),而不会破坏任何调用Tm()的代码.(这意味着JVM invokestatic指令执行一种动态方法查找超类链)

但是,这不过是麻烦.如果Tm()的含义默默地改变是非常危险的,因为现在它指向一个不同的方法.(实例方法应继承合同,这不是问题;静态方法中没有这样的理解.)

所以永远不应该使用这个"特征"; 该语言不应该启用它.

好的做法:如果我们调用Tm(),m()必须在T中声明; 如果不首先删除所有Tm(),就不应该从T中删除它.