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