【发布时间】:2017-09-23 23:37:54
【问题描述】:
此问题来自 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");
}
}
假设以下声明出现在 Bird 或 Dove 以外的类中:
Bird pigeon = new Dove();
调用pigeon.act()会打印什么?
我以为答案是“fly chirp”,但教科书上说答案是“fly chirp coo waddle”。我认为“鸽子”只能访问 Bird 中可用的方法?我的印象是,如果用户想要访问 Dove 中的方法,则必须将“pigeon”转换为 Dove。
Bird pigeon = new Bird(); 会给出相同的输出吗? Dove pigeon = new Dove();呢?
【问题讨论】:
-
任何类都可以使用
super关键字显式调用其父方法。 -
我了解 super 关键字的功能。我的问题是为什么“Bird pigeon”可以访问 Dove 中的方法。我以为“鸽子=新鸽子();”会产生“fly chirp coo waddle”。
-
@CarolineYi 子类继承了其父类的所有实例方法。现在子类可以选择覆盖被覆盖方法的行为。同样使用 super 关键字,它可以访问或调用其超级父类中定义的行为。现在建议您带上笔记本和笔,对您的代码进行试运行。查看方法是如何被调用的。以下答案(包括我的)可能会有所帮助。
-
只是添加如果您从子类外部查看子类然后,一旦子类继承了一个方法,那么覆盖意味着修改相同继承方法的行为 ,覆盖并不意味着添加额外的方法。它是子类的内部方法,实际上可以通过
super.调用超父类方法的行为@ -
@Caroline 如果您的问题得到解决,您可以选择一个已接受的答案,或者让我们知道您的更多疑问。
标签: java inheritance polymorphism superclass