我正在学习java,无法理解这个主题。 使用父类(super class)引用子类对象。在浏览了多个网站和帖子后,我的困惑更加增加了。 示例代码:
public abstract class Bird {
private void fly() {
System.out.println("Bird is flying");
}
public static void main(String[] args) {
Bird bird = new Pelican();
bird.fly();
}
}
class Pelican extends Bird {
protected void fly() {
System.out.println("Pelican is flying");
}
}
输出是 Bird is Flying - 为什么?
我还有 3 个问题:
Bird bird = new Pelican();
在上面的部分中,我可以使用什么来代替 Bird 类型(如果有更多扩展 Bird 的类)?我正在准备 OCA 1 考试,这个主题的问题让我很困惑。
使用这些引用时会输出哪些方法和变量?上面的例子中创建了pelican对象,但是运行的fly方法是bird?
如果转换完成,我可以使用哪些类型,不能使用哪些类型?
在 stackoverflow 和其他 java 网站上有多个关于此问题的问题,但多个来源、多个答案让我感到困惑。我知道时间很宝贵,但有人可以帮我一劳永逸地消除这个疑问吗?
提前致谢。
最佳答案
为了从子类调用该方法,您必须使用方法重写,也称为运行时多态性。由于您声明的对象是 Bird,并且它有一个无法重写的私有(private)方法 Fly,因此您的输出将是“Bird is Flying”。
但是,如果您将其初始化为
Pelican pelican = new Pelican();
那么输出将是“Pelican is moving”
您可以在这里阅读更多相关信息https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/
关于java - 使用父类(super class)/子类引用引用新对象 JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53879993/