静态方法及其重写

时间:2010-03-26 06:25:34

标签: 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");
    }
}

在这里没有重写?

5 个答案:

答案 0 :(得分:9)

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

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

next.show();

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

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

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

Java没有为此提供编译器错误。但是这种方法的行为不会像你期望的那样......更好地解释了here

答案 3 :(得分:0)

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

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

stat13.show(...);

OR

next.show(...);

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

答案 4 :(得分:0)

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

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

尝试一个简单的例子。