Из предыдущего моего ответа:
Я уверен, что фактическая реализация сильно отличается, но позвольте мне объяснить мое представление о методе диспетчеризации, который модели точно наблюдали поведение.
Представьте, что у каждого класса есть хеш-таблица, которая отображает сигнатуры метода (имена и типы параметров) на фактический кусок кода для реализации метода. Когда виртуальная машина пытается вызвать метод в экземпляре, она получает класс объекта и ищет запрошенную подпись в таблице класса. Если тело метода найдено, оно вызывается, предоставляя исходный объект в качестве ссылки с именем this
.
В противном случае родительский класс класса получается, и поиск там повторяется. Это продолжается до тех пор, пока метод не будет найден или не останется родительских классов, что приведет к NoSuchMethodError
.
Если суперкласс и подкласс имеют записи в своих таблицах для одной и той же сигнатуры метода, сначала встречается версия подкласса, и версия суперкласса никогда не используется - это «переопределение».