java是否有正当理由隐藏静态方法? 10 月,2 周 Questions & Answers 767 Possible Duplicate: Why doesn't Java allow overriding of static methods? 有没有正当的理由让派生类重写隐藏基类的static方法
# 2 楼答案 撇开术语不谈,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 楼答案
不能重写静态方法
要重写方法,必须首先继承该方法。如果该方法未被继承,则没有重写的机会。因此,您永远不能重写私有方法,因为它们不是继承的
# 2 楼答案
撇开术语不谈,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中移除它