java - 使用父类(super class)/子类引用引用新对象 JAVA

标签 java inheritance reference subclass superclass

我正在学习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();
  1. 在上面的部分中,我可以使用什么来代替 Bird 类型(如果有更多扩展 Bird 的类)?我正在准备 OCA 1 考试,这个主题的问题让我很困惑。

  2. 使用这些引用时会输出哪些方法和变量?上面的例子中创建了pelican对象,但是运行的fly方法是bird?

  3. 如果转换完成,我可以使用哪些类型,不能使用哪些类型?

在 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/

相关文章:

java - 如何将 Yeoman 脚手架与现有的 Java 目录结构相结合

python - set 和 frozenset 的继承行为似乎不同

c++ - 冲突声明(外部基础与派生)

java - 如何编写一个Map的set方法并将另一个Map作为值?

java - 从另一个java类调用静态方法

java - 使用spark从请求中提取参数数据

java - 为什么这里的错误出现在三元运算符中?

c++ - 多态继承不覆盖基类方法

c++ - 如果引用类型不匹配,为什么 std::is_constructible 将返回 false?

vb.net - 从项目引用中获取类型出现在智能感知中的问题