Java унаследовал теневое поле и JVM?

Является ли механизм затенения / скрытия полей наследованием и позднее разрешается частью спецификации JVM? Я знаю, что это часть спецификации Java, и ее можно найти во многих сообщениях в блогах и ТАКИХ вопросах. Однако, когда я на самом деле смотрю на спецификацию JVM для разрешения поля, слова "скрытие" или "затенение" нигде не появляются в pdf спецификации JVM.

Я спрашиваю об этом, потому что я пишу свою собственную JVM, и обнаружил, что это затенение полей является свойством байт-кода / VM, а не просто частью компилятора Java или языка Java. Я хочу знать правильный, авторитетный способ, которым это должно быть реализовано на уровне VM. Конечно, (неправильно?) Особенность JVM, эта важная вещь должна быть официально задокументирована где-нибудь?

1 ответ

Решение

Термин затенение обычно относится к тому, когда один идентификатор затеняет другой. Т.е. данное имя может ссылаться на несколько переменных, поэтому должен быть механизм устранения его неоднозначности. Это в основном конструкция уровня языка, потому что она содержит гораздо больше имен. Имена локальных переменных вообще не появляются в байт-коде, за исключением, например, дополнительной информации об отладке.

С точки зрения байт-кода, у вас уже есть явная ссылка на класс, имя и дескриптор. Единственный вопрос заключается в том, действительно ли описываемое вами поле объявлено в указанном вами классе, или оно было унаследовано от одного из его суперклассов.

Как вы уже обнаружили, разрешение поля объясняется в разделе 5.4.3.2 стандарта. Термины скрытие и теневое копирование не используются, поскольку они применяются к исходному коду, а не к файлам классов.

Другие вопросы по тегам