где обновляемая информация закончилась.

имеет множественное наследование. Реализация множественного наследования на уровне сборки может быть довольно сложной, но есть хорошиеописания онлайн о том, как это обычно делается (vtables, исправления указателей, thunks и т. д.).

Java не имеет множественного наследования реализации, но имеет множественное наследование интерфейса, поэтому я не думаю, что прямая реализация с одним vtable на класс может это реализовать. Как Java реализует интерфейсы внутри?

Я понимаю, что в отличие от C ++, Java компилируется Jit, поэтому разные части кода могут быть оптимизированы по-разному, а разные JVM могут работать по-разному. Итак, существует ли какая-то общая стратегия, которой придерживаются многие JVM, или кто-нибудь знает реализацию в конкретной JVM?

Кроме того, JVM часто девиртуализируют и вызывают встроенные вызовы методов, и в этом случае вообще не задействуются виртуальные таблицы или их эквиваленты, поэтому может не иметь смысла спрашивать о реальных последовательностях сборки, которые реализуют вызовы виртуальных / интерфейсных методов, но я предполагаю, что большинство JVM по-прежнему сохраняют некоторые своего рода общее представление о классах, которые можно использовать, если они не смогли девиртуализировать все. Это предположение неверно? Это представление выглядит как C ++ vtable? Если да, то есть у интерфейсов есть отдельные vtables и как они связаны с vtables класса? Если это так, могут ли экземпляры объектов иметь несколько указателей vtable (на vtables классов / интерфейсов), как экземпляры объектов в C ++? Всегда ли ссылки на тип класса и тип интерфейса на один и тот же объект имеют одинаковые двоичные значения или могут отличаться, как в C ++, где они требуют исправления указателя?

(для справки:этот вопрос спрашивает нечто подобное о CLR, и, как представляется, есть хорошее объяснение вэта статья MSDN хотя это может быть устаревшим к настоящему времени. Я не смог найти ничего подобного для Java.)

Редактировать:

Я имею в виду «реализует» в смысле «как компилятор GCC реализует целочисленное сложение / вызовы функций / и т. Д.», А не в смысле «Java-класс ArrayList реализует интерфейс List».Я знаю, как это работает на уровне байт-кода JVM, и я хочу знать, какой код и структуры данных генерируются JVM после того, как он завершил загрузку файлов классов и компиляцию байт-кода.

Ответы на вопрос(1)

Ваш ответ на вопрос