我现在正在阅读一本 Java 书籍,并且在思考 Dynamic Method Dispatch 的工作原理时坚持了很长时间。我知道这是一个强大且有价值的功能,但我不了解它的主要原理。例如,我有一个 B 类,它继承自 A 类并覆盖了 A 的一些方法。所以,当我写一个程序时,我可能会使用这些表达式
A a = new B();
a.someOverridenMethod();
我知道在这种情况下会调用方法的版本 B,而不是 A。但我不明白的部分是,为什么编译器不能确定要调用的方法的版本(超类或某个子类)?我的意思是,它明确指出该变量a
将包含对 B 类型对象的引用。那么为什么即使它在代码中明确说明,它也只能在运行时确定呢?