class A { void F() { System.out.println("a"); }}
class B extends A { void F() { System.out.println("b"); }}
public class X {
public static void main(String[] args) {
A objA = new B();
objA.F();
}
}
在这里,F()
正在被动态调用,不是吗?
这篇文章说:
... Java 字节码不支持动态方法调用。支持三种调用模式:invokestatic、invokespecial、invokeinterface 或invokevirtual。这些模式允许调用具有已知签名的方法。我们谈论强类型语言。这允许在编译时直接进行一些检查。
另一方面,动态语言使用动态类型。所以我们可以在编译时调用一个未知的方法,但这对于 Java 字节码是完全不可能的。
我错过了什么?