Наследование конструкторов в Java - PullRequest
0 голосов
/ 20 мая 2018

Всякий раз, когда в каком-либо производном классе вызывается какой-либо конструктор, задача выполняется только путем неявного или явного вызова конструктора базового класса (исправьте меня, если я ошибаюсь).

Поскольку мы намеревались создать экземплярпроизводного класса, но поскольку конструктор базового класса вызывается в конце.

Итак, как создается экземпляр производного класса, несмотря на то, что вызывается конструктор базового класса?

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Конструктор не очень удачно назван.Можно предположить, что он отвечает за создание (конструирование) объекта, но в действительности он отвечает за инициализацию уже существующего объекта.

Объект создан оператором new.Но этот объект «настроен», чтобы все его поля были заполнены значениями по умолчанию: null, false, 0 (в зависимости от типа).Чтобы сделать такой объект пригодным для использования в нашем приложении, нам нужно правильно его «настроить» (инициализировать), и это задача конструктора.

Но поскольку классы могут расширять другие классы, это необходимоиз конструкторов подкласса выполнять его код только после выполнения конструктора суперкласса (например, чтобы убедиться, что все унаследованные поля правильно инициализированы, чтобы мы могли использовать в нашем конструкторе унаследованные методы, которые фактически используют эти поля суперкласса).Вот почему вызов super(..) делается явно или неявно в начале каждого конструктора (кроме класса Object, поскольку он не расширяет другой класс).

0 голосов
/ 20 мая 2018

Не думайте, что конструктор создает экземпляр.Думайте об этом как о инициализации экземпляра, относительно этого конкретного класса.

Таким образом, процесс инициализации выглядит примерно так:

  • Выделение памяти
  • Инициализация объекта с точки зрения java.lang.Object
  • Инициализация объекта с точки зрения your.package.Superclass
  • Инициализация объекта с точки зрения your.package.Subclass

(Даже есливы начинаете с вызова new Subclass(...), тело конструктора суперкласса выполняется первым.)

Подробности инициализации объекта приведены в разделе JLS 12.5 .

...