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