точно происходит во время компиляции?Как компилятор узнает, что Parent p = new Child () является допустимым кодом, поскольку ни один объект не был создан во время компиляции?
Что ж, целые книги написаны на эту тему.По сути, компилятор анализирует входной источник и находит это назначение:
Parent p = new Child();
И теперь компилятор делает две вещи:
- проверяет, что он может узнать о печатает по обе стороны от задания
- , таким образом, он находит: для левой стороны требуется объект типа `Parent``
- itтакже смотрит на правую часть, чтобы понять (потенциальные) типы результатов, которые вытекают из этого выражения
Итак, в конце концов, компилятор увидит: «Мне нужен Parent ...и я получаю что-то, что является ребенком ".Затем компилятор должен проверить, удовлетворяет ли экземпляр Child «Мне нужен родитель».И очевидно: да.
Что именно происходит во время выполнения?Как распределяется память
Опять же, целые книги написаны об этом.См. здесь , например.
Неявный вызов конструктора родителя создает родительский объект.Дочерний объект также создается.Как он хранится и как jvm использует это для разрешения метода.
JVM "просто" знает две вещи:
- при резервировании памяти для дочернего объекта, также учитывает объем памяти, необходимый для любых полей суперкласса
- , поэтому, в конце концов, у вас просто есть одна область памяти, достаточно большая, чтобы удерживать все поля всех родительских классов, внизсамому классу Child
Наконец: статические методы являются наследственными, но да, в Java для них нет полиморфизма.Это просто точка проектирования языка и семантика, которые определены для Java.Это могло быть сделано по-другому, но 20+ назад отцы Java решили сделать это, как они сделали.