Команда invokespecial
JVM используется для вызова методов инициализации (<init>
) при создании новых объектов. Описание инструкции предлагает (но не уточняет), что решение о вызове конструктора суперкласса или конструктора текущего класса зависит от состояния флага ACC_SUPER
, установленного в файле class
.
Из спецификации Sun JVM:
Затем разрешенный метод выбирается для вызова, если не выполняются все следующие условия:
- Флаг ACC_SUPER (см. таблицу 4.1, "Доступ к классу и модификаторы свойств" ) установлен для текущего класса.
- Источник (invokespecial
определение кода операции)
Установка флага ACC_SUPER указывает, какая из двух альтернативных семантик для своей специальной команды вызывает виртуальную машину Java; флаг ACC_SUPER существует для обратной совместимости для кода, скомпилированного компиляторами Sun старше для языка программирования Java. Все новые реализации виртуальной машины Java должны реализовывать семантику для invokespecial, описанных в этой спецификации. Все новые компиляторы для набора инструкций виртуальной машины Java должны установить флаг ACC_SUPER. Компиляторы Sun старше генерировали флаги ClassFile с отключенным ACC_SUPER. В старых версиях Java Java Virtualization Java игнорирует флаг, если он установлен.
- Источник (ClassFile
format)
В определении указано, что флаг предназначен для обратной совместимости со старыми компиляторами. Однако это противоречит Sun older Java virtual machine implementations ignore the flag if it is set.
Используется ли флаг с кодом операции invokespecial
? Из того, что я могу сказать, это, кажется, не имеет никакой цели, и я не могу найти ресурс, чтобы предложить его когда-либо.
Спасибо.