2015-04-07 5 views
2

Чтобы иметь указатель на что-то, вам нужно точно знать, что это за тип, а для классов - все содержащиеся в нем данные. Я вижу, как полиморфизм будет работать для классов: указатель указывает на часть производного класса с теми же данными, что и родительский класс, и «не знает» дополнительных данных ниже.Как реализует интерфейс полиморфизма интерфейса?

Как это работает для интерфейсов Java? Интерфейс не предоставляет данных, а только гарантированный набор методов. Не существует объединяющих данных, на которые может указывать указатель базового класса.

Прошу прощения, если это не имеет смысла; Я могу попытаться прояснить ситуацию.

+0

Поскольку интерфейс гарантирует договор (или набор методов). –

+0

@ ElliottFrisch Я не понимаю; вы не можете указать на метод, не так ли? Вы говорите, что интерфейсы используют поле указателя функций для каждого из своих методов? – EMBLEM

ответ

3

Это зависит от реализации JVM. Реализация интерфейсов сложна.

Простейшее решение включает в себя передачу двух указателей для каждого параметра, который имеет тип интерфейса. Первый указатель указывает на объект. Второй указатель указывает на виртуальную таблицу, которая специфична для производного класса и комбинации интерфейсов. С помощью этого решения поиск соответствующего второго указателя для конкретного интерфейса приводит к линейному перемещению списка. Таким образом, это не O(1), а линейно ограничено числом реализованных интерфейсов. Интерфейсы не могут быть реализованы в O(1), не тратя много памяти на разреженные таблицы.

3

JVM находит методы интерфейса объекта с помощью сигнатуры метода, например, байт-код этого

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

вызывает List.add(Object) на ArrayList. Это похоже на отражение

+0

Я не понимаю, почему ответ вроде бы получил бы вверх. В нем ничего не говорится о том, как JVM фактически реализует интерфейсные вызовы. – Atsby

Смежные вопросы