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

时间:2011-09-23 04:24:18

标签: java static method-hiding

  

可能重复:
  Why doesn't Java allow overriding of static methods?

有没有合理的理由为什么人们希望派生类能够覆盖隐藏基类的static方法?

2 个答案:

答案 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)

无法覆盖静态方法

为了覆盖方法,必须首先继承该方法。如果该方法未被继承,则无法覆盖。因此,您永远不能覆盖私有方法,因为它们不会被继承。