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