Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 接口和纯抽象类之间的JVM实现差异?_Java_Jvm - Fatal编程技术网

Java 接口和纯抽象类之间的JVM实现差异?

Java 接口和纯抽象类之间的JVM实现差异?,java,jvm,Java,Jvm,我和我的朋友想知道,在JVM内部,接口和纯抽象类之间是否真的存在差异,或者它是否真的只是语法上的糖分 我真的不明白为什么会有差异,但这可能不是那么牵强。一定会有差异,因为抽象类可以容纳方法实现,而接口则不能。就字节码(.class文件)而言,它们是完全不同的: 发件人: 显然,类可以有一个超类(抽象或非抽象)和多个实现的接口。这是JVM的限制,而不是Java(语言)的限制。存在性能差异 每个对象在其对象头中都有一个指向其vtable的指针。vtable包含指向对象类型层次结构中定义的所有虚拟和抽

我和我的朋友想知道,在JVM内部,接口和纯抽象类之间是否真的存在差异,或者它是否真的只是语法上的糖分


我真的不明白为什么会有差异,但这可能不是那么牵强。

一定会有差异,因为抽象类可以容纳方法实现,而接口则不能。

就字节码(
.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)