使用 super/subclass 引用 JAVA 引用新对象

referencing new objects with super/subclass references JAVA

我目前正在学习 java 并且无法理解该主题。 使用超级 class 引用子 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");
    }
}

输出是鸟在飞 - 为什么?

我还有3个问题:

Bird bird = new Pelican();
  1. 在上面的部分中,我可以用什么来代替 Bird 类型(如果有更多 classes 扩展 Bird)?我正在准备 OCA 1 考试,关于这个主题的问题让我很困惑。

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

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

在 Whosebug 和其他 java 网站上有多个关于此的问题,但多个来源、多个答案让我感到困惑。我知道时间很宝贵,但有人可以为我一劳永逸地解决这个问题吗?
提前致谢。

在你的 Bird 摘要中 class 方法 fly 是私有的。您不能继承或覆盖私有方法:因此

class Pelican extends Bird {
 protected void fly() { System.out.println("Pelican is flying"); }
 }

实际上并没有覆盖父方法。

此外,您的代码存在编译问题,因为您无法调用私有引用方法class,而在您的 Bird Class 中,方法 fly 是私有的.

再次编译代码。

Welcome to Polymorphism in Java!

首先,您无法创建抽象的实例class,这是编译问题的原因。

输出不是“Pelican is flying”,因为无法覆盖私有方法,因为您正在使用 Bird 引用(父对象)创建鹈鹕对象(子对象 class) class).

Bird bird = new Pelican();

如果您想要所需的输出“Pelican is flying”,您还需要 Child class 的参考。

Pelican bird = new Pelican();

为了从子类调用方法,您必须使用方法覆盖,也称为运行时多态性。因为你声明的对象是 Bird 并且它有一个私有方法 fly 不能被覆盖,所以你的输出将是 "Bird is flying"。

但是,如果您将其初始化为

鹈鹕鹈鹕=新鹈鹕();

那么输出将是 "Pelican is flying"

您可以在此处阅读更多相关信息 https://www.geeksforgeeks.org/dynamic-method-dispatch-runtime-polymorphism-java/