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)
这里没有压倒一切吗?
不,你没有覆盖任何东西 - 你只是隐藏了原始方法.
不幸的是,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通常重写的值无关.
这是“隐藏”,而不是“压倒”。要查看这一点,请将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 样式检查器/代码审核工具通常会将其标记为样式错误/潜在错误。
| 归档时间: |
|
| 查看次数: |
720 次 |
| 最近记录: |