为什么这个对象可以访问它的父类的方法?

Car*_* Yi 5 java polymorphism inheritance superclass

该问题取自 AP 计算机科学练习测试。

public class Bird
{
    public void act()
    {
        System.out.print("fly"); 
        makeNoise(); 
    }
    public void makeNoise()
    {
        System.out.print("chirp"); 
    }
}

public class Dove extends Bird
{
    public void act()
    {
        super.act(); 
        System.out.print("waddle"); 
    }
    public void makeNoise()
    {
        super.makeNoise(); 
        System.out.print("coo"); 
    }
}
Run Code Online (Sandbox Code Playgroud)

假设以下声明出现在 Bird 或 Dove 之外的类中:

Bird pigeon = new Dove(); 
Run Code Online (Sandbox Code Playgroud)

调用的结果是什么pigeon.act()

我以为答案是“fly chirp”,但课本上说答案是“fly chirp coo waddle”。我认为“鸽子”只能访问 Bird 中可用的方法?我的印象是,如果用户想要访问 Dove 中的方法,则必须将“pigeon”转换为 Dove。

Bird pigeon = new Bird();给出相同的输出吗?怎么样Dove pigeon = new Dove();

nit*_*.kk 1

从你的问题“我认为‘pigeon’只能访问Bird中可用的方法?我的印象是,如果用户想要访问Dove中的方法,‘pigeon’必须转换为Dove。” 这其实是真的

让我们尝试在理解中找到 mssing 链接。

  1. 当我们有像Bird pigeon = new Dove();where Doveextends这样的代码时Bird,我们就有实际的对象 ofDove和引用类型 is of Bird。由于对象是这样的,因此它具有从超类继承的Dove方法以及添加的 方法

  2. 另一重要的一点是所有overriden方法都只有一个实例。它的覆盖意味着同一方法的行为已被修改,它不是一个额外的单独方法。继承方法只有一份副本,而不是两者都有。它的重载方法是独立的,只是名称相同但签名不同。这就是当您调用任何重写方法时您会得到 Dove 行为的原因。

  3. 这个很简单super,使用它子类可以访问其超类的可访问(可见)实体(实例属性和方法)。如果子类使用super关键字调用方法,则调用父类的方法。但这又可以被认为是子类的作者故意这样做的。一旦编写了类并创建了此类的对象,那么在对象上使用.(点运算符)用户只能调用对象中的内容。如果任何方法使用了super关键字,则它是对象行为的一部分。如果子类对象在子类中被重写,则子类对象的用户无法调用父类方法的行为。

  4. 最后是的,如果您希望 Dove使用(超级类)的引用来调用(Bird子类)的任何附加方法,那么您需要将其转换为Dove.