Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.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如何实现接口多态性?_Java_Pointers_Interface_Polymorphism - Fatal编程技术网

Java如何实现接口多态性?

Java如何实现接口多态性?,java,pointers,interface,polymorphism,Java,Pointers,Interface,Polymorphism,为了拥有指向某个对象的指针,您需要准确地知道它是什么类型,对于类,需要知道它包含的所有数据。我可以看到多态性对类的作用:指针指向派生类中与父类具有相同数据的部分,并且“不知道”它下面的其他数据 那么,这对Java接口是如何工作的呢?接口不提供数据,只提供一组有保证的方法。基类指针无法指向任何统一的数据 如果这不合理,我很抱歉;我可以试着说得更清楚些。JVM通过方法签名在对象中找到接口方法,例如这个字节码 INVOKEINTERFACE java/util/List.add (Ljava/lang

为了拥有指向某个对象的指针,您需要准确地知道它是什么类型,对于类,需要知道它包含的所有数据。我可以看到多态性对类的作用:指针指向派生类中与父类具有相同数据的部分,并且“不知道”它下面的其他数据

那么,这对Java接口是如何工作的呢?接口不提供数据,只提供一组有保证的方法。基类指针无法指向任何统一的数据


如果这不合理,我很抱歉;我可以试着说得更清楚些。

JVM通过方法签名在对象中找到接口方法,例如这个字节码

INVOKEINTERFACE java/util/List.add (Ljava/lang/Object;)Z

在ArrayList上调用
列表。添加(对象)
。这类似于反射,它取决于JVM实现。接口的实现很棘手


最简单的解决方案是为每个接口类型的参数传递两个指针。第一个指针指向对象。第二个指针指向特定于派生类和接口组合的虚拟表。使用此解决方案,为特定接口强制转换找到合适的第二个指针需要线性遍历列表。因此,它不是
O(1)
,而是在实现的接口数量上线性有界。在
O(1)
中实现接口必须在稀疏表上浪费大量内存。

因为接口保证契约(或方法集)。@ElliottFrisch我不明白;你不能指出一种方法,是吗?你是说接口的每一个方法都使用函数指针字段吗?我不明白为什么这样的答案会得到支持。它没有解释JVM实际上如何实现接口调用。