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