java - 为什么我可以访问父类中的子方法?

标签 java inheritance

我对 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 的行为就不是这样了! 这是为什么?

最佳答案

您在这里处理的是 polymorphismc 被实例化为 new child(),这就是为什么您会得到 child 作为输出。 p 的类型为 parent 的事实并没有改变这一事实,它仍然指向 child 的实例。

关于java - 为什么我可以访问父类中的子方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26544952/

相关文章:

java - 适当的 Java 堆大小

java - JPanel 中 JLabels 显示不正确

c++ - Qt/C++ 从 QPolygonF 继承为 QList 项

c# - 只能在 C# 中的程序集内继承

oop - Lua继承不包括元方法吗?

java - IntelliJ 为什么/如何在 Netbeans 中引起调试输出?

java - 如何实现自旋锁以避免阻塞

java - 不幸的是谷歌地图已经停止

ios - 父子 uitableviewcell 之间共享 xib 文件

c++ - 添加自定义析构函数时, move 构造函数在派生类中消失