java - 为什么动态调度的目标不是在编译时确定的?

标签 java inheritance polymorphism superclass method-dispatch

我现在正在读一本 Java 书,并且思考了很长一段时间动态方法调度是如何工作的。我知道这是一个强大且有值(value)的功能,但我不明白它的主要原理。例如,我有一个类B,它继承自类A并重写了A的一些方法。所以,当我编写程序时,我可能会使用这些表达式

A a = new B();
a.someOverridenMethod();

我知道在这种情况下,将调用方法的版本 B,而不是 A。但我不明白的是,为什么编译器不能确定该方法的哪个版本(父类(super class)或某个子类)打电话?我的意思是,它明确指出变量 a 将保存对类型 B 的对象的引用。那么为什么即使在代码中明确指出,也只能在运行时确定这一点?

最佳答案

一个更清楚的例子可能是:

A a = null;

if (getUserInput() == 'B')
{
  a = new B();
}
else
{
  a = new C();
}

a.overridenMethod();

编译器可能不知道将调用哪个方法 - 它由用户在运行时确定!

关于java - 为什么动态调度的目标不是在编译时确定的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25728055/

相关文章:

java - ArrayList IndexOfBound从firestore数据库获取数据时出现异常,为什么?

Java Swing 为游戏添加组件

python - 为什么我的父类(super class)调用我的子类方法?

c++ - dynamic_cast 真的适用于多重继承吗?

Java——将数据输入与数据输出关联起来?

java - 通过多态交换对象的位置

Java执行弹出新窗口后立即消失

java - 单击 ImageView 时开始新视频

c++ - 如何不继承 C++ 类中的变量

Python继承初始化问题