Наследование и распределение памяти - PullRequest
0 голосов
/ 01 июля 2019

для следующего кода:

class Parent {
    public void say(){
        System.out.println("Parent");
    }
}

class Child extends Parent{
    public void say(){
        System.out.println("Parent");
    }
}

class Test {
    public static void main(String[] args){

        Parent p = new Child(); // What does the compiler check  
        p.say();
    }
}

Следующие вопросы всегда смущали меня.

1.что именно происходит во время компиляции?Как компилятор узнает, что Parent p = new Child () является допустимым кодом, поскольку ни один объект не был создан во время компиляции?

2.что именно происходит во время выполнения?Как распределяется память

3.Неявный вызов конструктора родителя создает родительский объект.Дочерний объект также создается.Как это хранится и как jvm использует это для разрешения метода.

4.Наконец, JVM жестко закодирован, чтобы не переопределять статические методы и переменные, или есть какая-то другая причина.Почему мы не можем использовать метод экземпляра объектов времени выполнения (), почему не переменные объектов времени выполнения

Где я могу прочитать больше по этим темам?

Спасибо

1 Ответ

2 голосов
/ 01 июля 2019

точно происходит во время компиляции?Как компилятор узнает, что Parent p = new Child () является допустимым кодом, поскольку ни один объект не был создан во время компиляции?

Что ж, целые книги написаны на эту тему.По сути, компилятор анализирует входной источник и находит это назначение:

Parent p = new Child(); 

И теперь компилятор делает две вещи:

  • проверяет, что он может узнать о печатает по обе стороны от задания
  • , таким образом, он находит: для левой стороны требуется объект типа `Parent``
  • itтакже смотрит на правую часть, чтобы понять (потенциальные) типы результатов, которые вытекают из этого выражения

Итак, в конце концов, компилятор увидит: «Мне нужен Parent ...и я получаю что-то, что является ребенком ".Затем компилятор должен проверить, удовлетворяет ли экземпляр Child «Мне нужен родитель».И очевидно: да.

Что именно происходит во время выполнения?Как распределяется память

Опять же, целые книги написаны об этом.См. здесь , например.

Неявный вызов конструктора родителя создает родительский объект.Дочерний объект также создается.Как он хранится и как jvm использует это для разрешения метода.

JVM "просто" знает две вещи:

  • при резервировании памяти для дочернего объекта, также учитывает объем памяти, необходимый для любых полей суперкласса
  • , поэтому, в конце концов, у вас просто есть одна область памяти, достаточно большая, чтобы удерживать все поля всех родительских классов, внизсамому классу Child

Наконец: статические методы являются наследственными, но да, в Java для них нет полиморфизма.Это просто точка проектирования языка и семантика, которые определены для Java.Это могло быть сделано по-другому, но 20+ назад отцы Java решили сделать это, как они сделали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...