静态方法及其重写

abs*_*son 5 java

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没有压倒一切吗?

Jon*_*eet 9

不,你没有覆盖任何东西 - 你只是隐藏了原始方法.

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

next.show();
Run Code Online (Sandbox Code Playgroud)

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

public static void showStat(stat13 x)
{
    x.show();
}
...
showStat(new next());
Run Code Online (Sandbox Code Playgroud)

换句话说,绑定到正确的方法是在编译时完成的,并且与x通常重写的值无关.


Ste*_*n C 4

这是“隐藏”,而不是“压倒”。要查看这一点,请将main方法更改为以下内容:

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

这应该打印:

Static in derived
Static in base
Run Code Online (Sandbox Code Playgroud)

如果确实发生了重写,那么您会看到:

Static in derived
Static in derived
Run Code Online (Sandbox Code Playgroud)

通常认为使用实例类型调用静态方法是不好的风格...就像您正在做的那样...因为很容易认为您正在调用实例方法,并且很容易混淆认为正在发生重写。Java 样式检查器/代码审核工具通常会将其标记为样式错误/潜在错误。