Java 接口和纯抽象类之间的JVM实现差异?
我和我的朋友想知道,在JVM内部,接口和纯抽象类之间是否真的存在差异,或者它是否真的只是语法上的糖分Java 接口和纯抽象类之间的JVM实现差异?,java,jvm,Java,Jvm,我和我的朋友想知道,在JVM内部,接口和纯抽象类之间是否真的存在差异,或者它是否真的只是语法上的糖分 我真的不明白为什么会有差异,但这可能不是那么牵强。一定会有差异,因为抽象类可以容纳方法实现,而接口则不能。就字节码(.class文件)而言,它们是完全不同的: 发件人: 显然,类可以有一个超类(抽象或非抽象)和多个实现的接口。这是JVM的限制,而不是Java(语言)的限制。存在性能差异 每个对象在其对象头中都有一个指向其vtable的指针。vtable包含指向对象类型层次结构中定义的所有虚拟和抽
我真的不明白为什么会有差异,但这可能不是那么牵强。一定会有差异,因为抽象类可以容纳方法实现,而接口则不能。就字节码(
.class
文件)而言,它们是完全不同的:
发件人:
显然,类可以有一个超类(
抽象
或非抽象)和多个实现的接口。这是JVM的限制,而不是Java(语言)的限制。存在性能差异
每个对象在其对象头中都有一个指向其vtable的指针。vtable包含指向对象类型层次结构中定义的所有虚拟和抽象方法的指针。它们是有序的,并且具有众所周知的索引,这使得调用这种方法非常有效。下面是如何(在伪代码中)
但是这种方案对于接口来说是不可行的,因为在这种情况下不可能分配静态插槽号(因为可能有大量潜在的接口和方法)。因为接口调用使用了一种更通用、更昂贵的不同技术
ClassFile {
//...
u2 constant_pool_count;
cp_info constant_pool[constant_pool_count-1];
//...
u2 super_class;
u2 interfaces_count;
u2 interfaces[interfaces_count];
}
obj.vtable[0].call(); //this calls the method in the first slot (which might well be toString)