静态方法及其重写

Java不允许覆盖静态方法,但是,

class stat13 { static void show() { System.out.println("Static in base"); } public static void main(String[] ar) { new next().show(); } } class next extends stat13 { static void show() { System.out.println("Static in derived"); } } 

这里没有压倒一切吗?

这是“隐藏”,而不是“重写”。 要查看此内容,请将main方法更改为以下内容:

 public static void main (String[] arghh) { next n = new next(); n.show(); stat13 s = n; s.show(); } 

这应该打印:

 Static in derived Static in base 

如果有真正的重写,那么你会看到:

 Static in derived Static in derived 

通常认为使用实例类型调用静态方法是不好的样式…就像你正在做的那样…因为很容易认为你正在调用实例方法,并且认为重写正在发生时会感到困惑。 Java样式检查器/代码审计工具通常会将其标记为样式错误/潜在错误。

不,你没有覆盖任何东西 – 你只是隐藏原始方法。

不幸的是,Java允许您通过引用调用静态方法。 你的电话更简单地写成:

 next.show(); 

重要的是,此代码仍将调用stat13中的原始版本:

 public static void showStat(stat13 x) { x.show(); } ... showStat(new next()); 

换句话说,绑定到正确的方法是在编译时完成的,并且与x的值无关 – 它通常会覆盖。

Java不会为此提供编译器错误。 但是这种方法不会像你期望的那样…… 在这里有更好的解释

当子类为方法提供自己的实现以便调用子类实例时,会发生覆盖。 这里的操作词是 – 实例。

静态方法在类的上下文中调用,例如

 stat13.show(...); 

要么

 next.show(...); 

FWIW,您的示例代码不是覆盖的示例。

覆盖发生在对象级别。 对于ex obj1.overridedmenthod()。 并且没有覆盖类级方法的概念,即…静态方法ex:Class.overridedmethod()。

并且这个覆盖静态方法的概念被称为方法隐藏。

试试一个简单的例子。