Java如何实现接口多态性?
为了拥有指向某个对象的指针,您需要准确地知道它是什么类型,对于类,需要知道它包含的所有数据。我可以看到多态性对类的作用:指针指向派生类中与父类具有相同数据的部分,并且“不知道”它下面的其他数据 那么,这对Java接口是如何工作的呢?接口不提供数据,只提供一组有保证的方法。基类指针无法指向任何统一的数据Java如何实现接口多态性?,java,pointers,interface,polymorphism,Java,Pointers,Interface,Polymorphism,为了拥有指向某个对象的指针,您需要准确地知道它是什么类型,对于类,需要知道它包含的所有数据。我可以看到多态性对类的作用:指针指向派生类中与父类具有相同数据的部分,并且“不知道”它下面的其他数据 那么,这对Java接口是如何工作的呢?接口不提供数据,只提供一组有保证的方法。基类指针无法指向任何统一的数据 如果这不合理,我很抱歉;我可以试着说得更清楚些。JVM通过方法签名在对象中找到接口方法,例如这个字节码 INVOKEINTERFACE java/util/List.add (Ljava/lang
如果这不合理,我很抱歉;我可以试着说得更清楚些。JVM通过方法签名在对象中找到接口方法,例如这个字节码
INVOKEINTERFACE java/util/List.add (Ljava/lang/Object;)Z
在ArrayList上调用
列表。添加(对象)
。这类似于反射,它取决于JVM实现。接口的实现很棘手
最简单的解决方案是为每个接口类型的参数传递两个指针。第一个指针指向对象。第二个指针指向特定于派生类和接口组合的虚拟表。使用此解决方案,为特定接口强制转换找到合适的第二个指针需要线性遍历列表。因此,它不是
O(1)
,而是在实现的接口数量上线性有界。在O(1)
中实现接口必须在稀疏表上浪费大量内存。因为接口保证契约(或方法集)。@ElliottFrisch我不明白;你不能指出一种方法,是吗?你是说接口的每一个方法都使用函数指针字段吗?我不明白为什么这样的答案会得到支持。它没有解释JVM实际上如何实现接口调用。