【问题标题】:Static methods and their overriding静态方法及其覆盖
【发布时间】:2010-03-26 06:25:33
【问题描述】:

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

这里没有覆盖吗?

【问题讨论】:

  • 请考虑编辑问题...代码不太可读。
  • 感谢 pgras 编辑问题你能告诉我你是如何格式化的吗?

标签: java


【解决方案1】:

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

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

next.show();

重要的是,这段代码仍然会调用 stat13 中的原始版本:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      Java 不会为此给出编译器错误。但是这种方法不会像您期望的那样表现...更好地解释here

      【讨论】:

        【解决方案4】:

        当一个子类为一个方法提供它自己的实现以便调用子类实例时,就会发生覆盖。这里的关键词是 - instance。

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

        stat13.show(...);
        

        next.show(...);
        

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

        【讨论】:

          【解决方案5】:

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

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

          尝试一个简单的例子。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-04
            • 2010-10-27
            相关资源
            最近更新 更多