编辑:没关系,我明白了。由于该方法是静态的,因此它只查看变量的编译时类型,并且它的实例化没有区别。
class Parent {
void sayIt() {
System.out.println("Miss ");
}
}
class Child extends Parent {
static void sayIt() {
System.out.println("Hit ");
}
public static void main(String args[]) {
Parent papa = new Parent();
papa.sayIt();
Child kid = new Child();
kid.sayIt();
papa = kid;
papa.sayIt();
kid = (Child)papa;
kid.sayIt();
}
}
这打印出“Miss Hit Hit Hit”。我明白了。但是,如果我将sayIt()
方法更改为静态:
class Parent {
static void sayIt() {
System.out.println("Miss ");
}
}
class Child extends Parent {
static void sayIt() {
System.out.println("Hit ");
}
public static void main(String args[]) {
Parent papa = new Parent();
papa.sayIt();
Child kid = new Child();
kid.sayIt();
papa = kid;
papa.sayIt();
kid = (Child)papa;
kid.sayIt();
}
现在打印出“Hit Miss Hit Miss”。
我无法弄清楚为什么会发生这种情况。有线索吗?
答案 0 :(得分:0)
首先,问题永远不应该是继承静态方法。继承不适用于静态方法。
您无需创建用于访问静态方法的实例。
使用Parent.sayIt()
- 访问用Parent.java编写的静态方法
使用Child.sayIt()
- 访问用Child.java编写的静态方法
答案 1 :(得分:0)
静态方法取决于引用类型而不是对象类型。 papa.sayIt();
始终打印Miss
,因为编译器会将其替换为Parent.sayIt();
。关于第一种情况,您实际上是隐藏父方法而不是覆盖它。
答案 2 :(得分:0)
Parent papa = new Parent();
- 表示父类,您有静态方法。当你尝试在引用上调用静态方法时,它不会查看它所持有的对象。
点击此处,添加这两行并进行测试。
Parent p = null;
p.sayIt();
你没有看到NPE,它会调用你的静态方法。