【问题标题】:referencing new objects with super/subclass references JAVA使用超类/子类引用 JAVA 引用新对象
【发布时间】:2018-12-21 06:11:25
【问题描述】:

我目前正在学习 java 并且无法理解这个主题。 用超类引用子类对象。在浏览了多个网站和帖子之后,我的困惑增加了。 示例代码:

 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 类型(如果有更多类扩展 Bird)?我正在准备 OCA 1 考试,关于这个主题的问题让我很困惑。

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

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

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

【问题讨论】:

    标签: java inheritance reference subclass superclass


    【解决方案1】:

    为了让您从子类调用方法,您必须使用方法覆盖,也称为运行时多态性。由于您声明的对象是 Bird,并且它有一个无法覆盖的私有 fly 方法,因此您的输出将是“Bird is fly”。

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

    鹈鹕鹈鹕 = 新鹈鹕();

    那么输出将是“鹈鹕正在飞行”

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

    【讨论】:

    • 那么,如果修改代码以使两个类都使用公共方法,那么重写的方法会执行吗? - 我回家后会在电脑上试一试,但只是想知道是否还有其他因素决定运行哪种方法。
    • 是的,记得在 Pelican 的 fly() 方法上添加 @Override 注解
    【解决方案2】:

    欢迎使用 Java 中的多态性!

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

    输出不是“Pelican is fly”,因为私有方法不能被覆盖,因为您正在使用 Bird 引用(父类)创建 pelican 对象(子类)。

    Bird bird = new Pelican();
    

    如果您想要所需的输出“鹈鹕正在飞行”,您还需要 Child 类的引用。

    Pelican bird = new Pelican();
    

    【讨论】:

    • @Hades 所以我在回答中指定了
    【解决方案3】:

    在您的 Bird 抽象类中,方法 fly 是私有的。您不能继承或覆盖私有方法:因此

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

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

    此外,您的代码存在编译问题,因为您无法调用引用类的私有方法,并且在您的 Bird 类中,方法 fly 是私有的

    再次编译代码。

    【讨论】:

    • 我直接复制粘贴了 Sybex 的 OCA 1 书中的问题,没有进行任何修改。它说答案是“鸟在飞”。那么问题可能是错误的?
    • @Chandradhar 是的,恐怕是的,您可以将代码粘贴到任何 IDE 或 Java 编译器中,然后自己查看结果。
    • @Chandradhar 如果答案对您有帮助,请您投赞成票。谢谢
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 2017-04-30
    • 2014-09-08
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    相关资源
    最近更新 更多