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");
}
}
在这里没有重写?
答案 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()。
这个覆盖静态方法的概念被称为方法隐藏。
尝试一个简单的例子。