[英]Inheriting static methods
编辑:没关系,我想通了。 由于该方法是静态的,因此它仅查看变量的编译时类型,而对其的实例化则没有影响。
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();
}
现在,它会打印“命中小姐命中小姐”。
我不知道为什么会这样。 有什么线索吗?
首先,问题永远不应该是继承静态方法。 继承不适用于静态方法。
您不必创建实例来访问静态方法。
Use Parent.sayIt()
-用于访问用Parent.java编写的静态方法
Use Child.sayIt()
-用于访问用Child.java编写的静态方法
静态方法取决于引用类型,而不取决于对象类型。 papa.sayIt();
总是打印Miss
因为编译器将其替换为Parent.sayIt();
。 关于第一种情况,您实际上是在隐藏父方法而不是对其进行覆盖。
请参阅: 覆盖vs隐藏Java-困惑
Parent papa = new Parent();
-表示父类,并且您有静态方法。 当您尝试在引用上调用静态方法时,它将不会查看它所持有的对象。
选中此处,添加这两行并进行测试。
Parent p = null;
p.sayIt();
您没有看到NPE,它调用了您的静态方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.