2015-04-07 184 views
2

爲了有一個指向某個東西的指針,你需要確切地知道它是什麼類型,以及類,它包含的所有數據。我可以看到多態性是如何工作的:類指針指向派生類中與父類相同的數據部分,並且「不知道」下面的附加數據。Java如何實現接口多態性?

那麼,這是否適用於Java接口?一個接口不提供數據,只提供一套有保證的方法。沒有可以指向基類指針的統一數據。

對不起,如果這沒有意義;我可以試着讓它更清楚。

+0

因爲接口保證合同(或一組方法)。 –

+0

@ElliottFrisch我不明白;你不能指出一種方法,你能嗎?你是說接口對他們每一種方法都使用函數指針字段嗎? – EMBLEM

回答

3

它取決於JVM的實現。接口的實現是棘手的。

最簡單的解決方案包括爲每個接口類型的參數傳遞兩個指針。第一個指針指向該對象。第二個指針指向特定於派生類和接口組合的虛擬表。使用這個解決方案,爲特定的接口轉換找到合適的第二個指針包括線性地走一個列表。因此它不是O(1),但是在實現的接口數量上是線性的。接口不能在O(1)中實現,而不會在稀疏表上浪費大量內存。

3

JVM通過方法簽名找到對象中的一個的接口方法,例如,此字節碼

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

上一個ArrayList調用List.add(Object)。這就像在反思

+0

我不明白爲什麼這樣的答案會得到upvotes。它沒有說明JVM如何實際實現接口調用。 – Atsby