Таблица методов Java

Я многое узнал о том, как C++ управляет своими виртуальными таблицами при наличии наследования (множественного, виртуального и т. д.) и как он размещает объекты в памяти.

Теперь Java нужно беспокоиться только об одной строке наследования, не скрывать метод экземпляра и т. д., поэтому виртуальные таблицы в этом случае должны быть немного проще. Я знаю, что файлы Class действуют как «шлюзы» в область методов, где хранятся определения типов, включая, как я полагаю, байт-код метода. Мне приходят в голову следующие два вопроса:

  1. Существует ли вообще какая-либо структура таблицы vtable/method в Java? Как он хранится и связывается с Class объектами?
  2. Как решается вызов наследования/динамического метода? Я имею в виду:

Наличие следующих классов и экземпляров:

class A{ int f(){...} }
class B extends A{ int f(){...} }

A a = new B();
a.f();

f() в B вызывается. Является ли A разрешением через Class файл B правильным указателем метода?

Заранее большое спасибо за ваши комментарии.


person Bober02    schedule 19.04.2012    source источник


Ответы (3)


Вызов a.f() реализован на языке ассемблера байт-кода Java как:

aload_1 // load the local variable a, here from local address 1
invokevirtual with index into the constant pool for
    method ref:
        class "A"
        nameAndType "f", "()I"

Во время выполнения, возможно, vtable затем решает вызов B.f(). Но, как видите, формат класса довольно абстрактен, и JVM имеет полную свободу загрузки класса для «эффективной» реализации.

person Joop Eggen    schedule 19.04.2012
comment
Конечно. Я думаю, что разрешение во время выполнения будет использовать Class файл B и метод загрузки оттуда, поэтому вызывается B.f() - person Bober02; 19.04.2012
comment
@ Bober02 и этот ответ, и ваш комментарий являются лишь предположениями относительно второго вопроса, вы не упомянули, как именно выбирается реализация f() B. - person Sajuuk; 13.05.2019
comment
@Sajuuk vtable, виртуальная таблица методов, является термином реализации на C++, и не только на этом языке. Java предписывает переход к классам this. Java не предписывает и не описывает реализацию. См. quora.com/How-is-the -виртуальная-метод-таблица-реализованная-в-Java - person Joop Eggen; 13.05.2019
comment
@JoopEggen Вы предполагаете, что разные реализации Java почти не имеют ничего общего, когда дело доходит до реализации vtable? или бессмысленно обсуждать реализацию vtable, когда не упоминается конкретная реализация? - person Sajuuk; 13.05.2019

В Java указано только то, что он должен делать, а не то, как он это делает. Это имеет некоторые преимущества, заключающиеся в том, что код можно оптимизировать так, как это не позволяет С++. Например, «виртуальные» методы могут быть встроены в JVM, даже если они из другой библиотеки/jar.

person Peter Lawrey    schedule 19.04.2012
comment
Хорошо, какие-нибудь известные вам возможные решения, которые оказались успешными? как это делает САН? - person Bober02; 19.04.2012
comment
Я бы сказал: а) вам не нужно знать б) это может измениться в любое время, поэтому вы не захотите основывать решение на конкретной реализации. В C++, как только вы скомпилируете код, вы знаете, что он не изменится, в Java это не так, он даже меняется во время работы программы. - person Peter Lawrey; 19.04.2012
comment
@PeterLawrey Что вы подразумеваете под встроенным? - person Govinda Sakhare; 14.09.2020

Здесь связанный вопрос с ответами, содержащими правильные ссылки. Следует отметить одну вещь, которая не была сформулирована в вопросе SO, на который я ссылаюсь, заключается в том, что все методы в Java неявно виртуальны. Если вас интересуют технические подробности, посмотрите jvm.h (найдите строку "vtable").

person Alexander Pavlov    schedule 19.04.2012