C++ 有多重继承。在程序集级别实现多重继承可能非常复杂,但网上有很好的描述,说明这是如何正常完成的(vtables、指针修复、thunk 等)。
Java没有多重实现继承,但它确实有多重接口继承,所以我不认为每个类只有一个vtable的直接实现可以实现它。java内部是如何实现接口的?
我意识到与 C++ 不同,Java 是 Jit 编译的,因此不同的代码段可能会以不同的方式进行优化,并且不同的 JVM 可能会做不同的事情。那么,是否有许多 JVM 遵循的一些通用策略,或者是否有人知道特定 JVM 中的实现?
此外 JVM 经常去虚拟化和内联方法调用,在这种情况下根本不涉及 vtable 或等效项,因此询问实现虚拟/接口方法调用的实际汇编序列可能没有意义,但我假设大多数 JVM 仍然保留一些如果它们无法对所有内容进行虚拟化,则可以使用类的一般表示。这个假设是错误的吗?这种表示形式看起来像 C++ vtable 吗?如果是这样,接口是否有单独的 vtables,它们如何与类 vtables 链接?如果是这样,对象实例是否可以像 C++ 中的对象实例一样具有多个 vtable 指针(指向类/接口 vtable)?对同一对象的类类型和接口类型的引用是否总是具有相同的二进制值,或者它们是否会像在需要指针修复的 C++ 中那样不同?
(供参考:这个问题询问了有关 CLR 的类似问题,并且在这篇 msdn 文章中似乎有一个很好的解释,尽管现在可能已经过时了。我找不到任何类似的 Java 内容。)
编辑:
- 我的意思是“GCC 编译器如何实现整数加法/函数调用/等”的意义上的“实现”,而不是“Java 类 ArrayList 实现 List 接口”的意义上。
- 我知道这在 JVM 字节码级别是如何工作的,我想知道的是 JVM 在完成加载类文件和编译字节码后会生成什么样的代码和数据结构。