java - 关于方法调用的Java多态性的困惑
问题描述
我在处理这个Java 问题时遇到了问题:
考虑以下类:
public class Computer extends Mineral {
public void b() {
System.out.println("Computer b");
super.b();
}
public void c() {
System.out.println("Computer c");
}
}
public class Mineral extends Vegetable {
public void b() {
System.out.println("Mineral b");
a();
}
}
public class Animal extends Mineral {
public void a() {
System.out.println("Animal a");
}
public void c() {
b();
System.out.println("Animal c");
}
}
public class Vegetable {
public void a() {
System.out.println("Vegetable a");
}
public void b() {
System.out.println("Vegetable b");
}
}
假设定义了以下变量:
Vegetable var1 = new Computer();
Mineral var2 = new Animal();
Vegetable var3 = new Mineral();
Object var4 = new Mineral();
在显示的每个语句产生的输出下方的每一行上注明。如果语句产生多于一行的输出,则用斜杠表示换行符,如 a/b/c 以表示三行输出,a 后跟 b 后跟 c。如果该语句导致错误,请写下错误一词来表明这一点。
为了执行
var1.b()
我对输出感到困惑
通过仔细分析,我们必须注意到,当我们调用矿物的方法b()时:
public void b() {
System.out.println("Mineral b");
a();
}
我们也在调用一个方法
a()
因此,使用类层次图,可以调用方法
Vegetable.a()
解决方案
在Vegetable var1 = new Computer();
中,您有一个类型的引用变量Vegetable
,指向一个类型的对象Computer
。如果蔬菜是计算机的超类型,则分配有效。
var1.b()
如果引用变量 (Vegetable) 的类型具有 method ,则表达式将是合法的(编译通过) b()
。如果蔬菜类型没有方法b()
,则表达式将给出编译错误。
如果编译通过:在运行时,调用var1.b()
将调用b()
变量var1
指向的对象(即计算机类型的实例)上的方法。Computer.b()
overrides Mineral.b()
,因此将调用该方法。
推荐阅读
- svelte - 如何在雪包和苗条项目中使用 bip32 包
- r - R - 将 excel 文件导入为数据框,包括带有 Excel 文件名的新列
- laravel - 如何修复 heroko 中的 laravel 部署错误?
- python - 使用补习班和标签保存文件谷歌云存储
- apache-flink - 使用时间分散的事件在flink中管理水印的正确方法
- php - 为什么我在 laravel migrate:install 上收到错误?
- c++ - 为什么编译器在 printf 中将 char 转换为 int?
- wikipedia - 使用 Wikipedia Extractor 作为 Wikipedia Data Dump File 的解析器时出现“EOFError: Ran out of input”
- ios - 如何根据子图像的纵横比设置 UICollectionViewCell 的高度?
- azure-devops - AzureDevops 根据参数设置变量并在下一阶段传递给模板