Java 静态方法及其重写

Java 静态方法及其重写,java,Java,Java不允许重写静态方法 但是, 这里没有重写吗?没有,您没有重写任何内容-您只是隐藏了原始方法 不幸的是,Java允许您通过引用调用静态方法。您可以将其更简单地写为: next.show(); 重要的是,此代码仍将调用stat13中的原始版本: public static void showStat(stat13 x) { x.show(); } ... showStat(new next()); 换句话说,到正确方法的绑定是在编译时完成的,与x的值没有任何关系,而这通常与重写有

Java不允许重写静态方法 但是,


这里没有重写吗?

没有,您没有重写任何内容-您只是隐藏了原始方法

不幸的是,Java允许您通过引用调用静态方法。您可以将其更简单地写为:

next.show();
重要的是,此代码仍将调用stat13中的原始版本:

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

换句话说,到正确方法的绑定是在编译时完成的,与
x的值没有任何关系,而这通常与重写有关。

Java不会为此给出编译器错误。但是这个方法不会像你期望的那样。。。更好地解释

当子类为方法提供自己的实现,以便调用子类实例时,会发生重写。这里的关键词是-实例

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

stat13.show(...);

FWIW,您的示例代码不是重写的示例。

这是“隐藏”,而不是“重写”。要查看此信息,请将
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样式检查器/代码审计工具通常会将此标记为样式错误/潜在错误。

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

这种重写静态方法的概念被称为方法隐藏


尝试一个简单的例子。

请考虑编辑这个问题…代码不太可读。感谢pgras编辑这个问题,你能告诉我你是如何格式化的吗?
Static in derived
Static in base
Static in derived
Static in derived