爲了有一個指向某個東西的指針,你需要確切地知道它是什麼類型,以及類,它包含的所有數據。我可以看到多態性是如何工作的:類指針指向派生類中與父類相同的數據部分,並且「不知道」下面的附加數據。Java如何實現接口多態性?
那麼,這是否適用於Java接口?一個接口不提供數據,只提供一套有保證的方法。沒有可以指向基類指針的統一數據。
對不起,如果這沒有意義;我可以試着讓它更清楚。
爲了有一個指向某個東西的指針,你需要確切地知道它是什麼類型,以及類,它包含的所有數據。我可以看到多態性是如何工作的:類指針指向派生類中與父類相同的數據部分,並且「不知道」下面的附加數據。Java如何實現接口多態性?
那麼,這是否適用於Java接口?一個接口不提供數據,只提供一套有保證的方法。沒有可以指向基類指針的統一數據。
對不起,如果這沒有意義;我可以試着讓它更清楚。
它取決於JVM的實現。接口的實現是棘手的。
最簡單的解決方案包括爲每個接口類型的參數傳遞兩個指針。第一個指針指向該對象。第二個指針指向特定於派生類和接口組合的虛擬表。使用這個解決方案,爲特定的接口轉換找到合適的第二個指針包括線性地走一個列表。因此它不是O(1)
,但是在實現的接口數量上是線性的。接口不能在O(1)
中實現,而不會在稀疏表上浪費大量內存。
JVM通過方法簽名找到對象中的一個的接口方法,例如,此字節碼
INVOKEINTERFACE java/util/List.add (Ljava/lang/Object;)Z
上一個ArrayList調用List.add(Object)
。這就像在反思
我不明白爲什麼這樣的答案會得到upvotes。它沒有說明JVM如何實際實現接口調用。 – Atsby
因爲接口保證合同(或一組方法)。 –
@ElliottFrisch我不明白;你不能指出一種方法,你能嗎?你是說接口對他們每一種方法都使用函數指針字段嗎? – EMBLEM