我对 Java 继承的理解有问题:当我将子类强制转换回父类时,我能够访问子类被覆盖的方法。
作为示例,给出了以下两个类:
父级:
public class Parent {
public void whatAreYou() {
System.out.println("parent");
}
}
还有一个子类:
public class Child extends Parent {
@Override
public void whatAreYou() {
System.out.println("child");
}
public void onlyChildrenCanDoThis() {
//...
}
}
当我现在执行以下操作时:
Child c = new Child();
Parent p = c;
p.whatAreYou();
我得到这个输出:
child
这对于我对Java继承的理解来说很奇怪。我希望获得 parent
输出,因为我将子类缩小到父类,这样我就应该可以访问父类的变量和方法。
这与p.onlyChildrenCanDoThis()
一起使用,因为我无法访问它,因为它没有在父类中实现...
...但是对于覆盖方法,Java 的行为就不是这样了! 这是为什么?
最佳答案
您在这里处理的是 polymorphism 。 c
被实例化为 new child()
,这就是为什么您会得到 child
作为输出。 p
的类型为 parent
的事实并没有改变这一事实,它仍然指向 child
的实例。
关于java - 为什么我可以访问父类中的子方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26544952/