【发布时间】:2019-12-04 06:54:25
【问题描述】:
以下代码:
public class NewClass {
public static class superclass {
static void print()
{
System.out.println("print in superclass.");
}
}
public static class subclass extends superclass {
static void print()
{
System.out.println("print in subclass.");
}
}
public static void main(String[] args)
{
superclass A = new superclass();
superclass B = new subclass();
A.print();
B.print();
}
}
这里B.print() 打印-->“在超类中打印。”,但我希望它打印“在子类中打印”。因为'B'是子类的对象。
但是,如果我将static void print() 更改为void print(),那么它会正确打印“在子类中打印。”。
谁能帮助理解这一点?
【问题讨论】:
-
方法覆盖仅存在于实例方法中。静态方法不能被覆盖。
-
动态绑定不适用于静态方法。
-
静态方法始终属于其定义的类,因此您不会调用继承的方法。
-
@mkemmerz,但是
superclass B = new subclass();会创建子类的对象,对吧? -
@GarimaAgarwal 确实如此!但是,您没有调用实例方法。这很令人困惑,因为您打破了 java 命名约定。 B.print() 不是调用你声明的对象 B,而是调用 B 的静态方法。
标签: java inheritance static