我现在正在读一本 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/