Java 静态方法及其重写
Java不允许重写静态方法 但是,Java 静态方法及其重写,java,Java,Java不允许重写静态方法 但是, 这里没有重写吗?没有,您没有重写任何内容-您只是隐藏了原始方法 不幸的是,Java允许您通过引用调用静态方法。您可以将其更简单地写为: next.show(); 重要的是,此代码仍将调用stat13中的原始版本: public static void showStat(stat13 x) { x.show(); } ... showStat(new next()); 换句话说,到正确方法的绑定是在编译时完成的,与x的值没有任何关系,而这通常与重写有
这里没有重写吗?没有,您没有重写任何内容-您只是隐藏了原始方法 不幸的是,Java允许您通过引用调用静态方法。您可以将其更简单地写为:
next.show();
重要的是,此代码仍将调用stat13中的原始版本:
public static void showStat(stat13 x)
{
x.show();
}
...
showStat(new next());
换句话说,到正确方法的绑定是在编译时完成的,与
x的值没有任何关系,而这通常与重写有关。Java不会为此给出编译器错误。但是这个方法不会像你期望的那样。。。更好地解释当子类为方法提供自己的实现,以便调用子类实例时,会发生重写。这里的关键词是-实例
静态方法在类的上下文中调用,例如
stat13.show(...);
或
FWIW,您的示例代码不是重写的示例。这是“隐藏”,而不是“重写”。要查看此信息,请将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样式检查器/代码审计工具通常会将此标记为样式错误/潜在错误。重写发生在对象级别。对于ex obj1.overridedmenthod()。并且没有覆盖类级方法的概念,例如。。。静态方法ex:Class.overridedmethod()
这种重写静态方法的概念被称为方法隐藏
尝试一个简单的例子。
请考虑编辑这个问题…代码不太可读。感谢pgras编辑这个问题,你能告诉我你是如何格式化的吗?
Static in derived
Static in base
Static in derived
Static in derived