Наследование конструкторов в Java
Всякий раз, когда какой-либо конструктор вызывается в каком-либо производном классе, задача выполняется только путем неявного или явного вызова конструктора базового класса (поправьте меня, если я здесь не прав).
Поскольку мы намеревались создать экземпляр производного класса, но поскольку конструктор базового класса вызывается в конце.
Итак, как создается экземпляр производного класса, несмотря на то, что вызывается конструктор базового класса?
2 ответа
Не думайте, что конструктор создает экземпляр. Думайте об этом как об инициализации экземпляра в отношении этого конкретного класса.
Так что процесс инициализации выглядит примерно так:
- Выделить память
- Инициализировать объект с точки зрения
java.lang.Object
- Инициализировать объект с точки зрения
your.package.Superclass
- Инициализировать объект с точки зрения
your.package.Subclass
(Даже если вы начинаете с звонка new Subclass(...)
, тело конструктора суперкласса выполняется первым.)
Детали инициализации объекта приведены в разделе 12.5 JLS.
Конструктор это не очень удачное имя. Можно предположить, что он отвечает за создание (конструирование) объекта, но в действительности он отвечает за инициализацию уже существующего объекта.
Объект создан new
оператор. Но этот объект "настроен", чтобы все его поля были заполнены значениями по умолчанию: null, false, 0 (в зависимости от типа). Чтобы сделать такой объект пригодным для использования в нашем приложении, нам нужно правильно его "настроить" (инициализировать), и это задача конструктора.
Но поскольку классы могут расширять другие классы, от конструкторов подкласса требуется выполнять его код только после выполнения конструктора суперкласса (например, чтобы убедиться, что все унаследованные поля правильно инициализированы, чтобы мы могли использовать в нашем конструкторе унаследованные методы, которые на самом деле используют эти поля суперкласса). Вот почему super(..)
вызов делается явно или неявно в начале каждого конструктора (кроме Object
класс, так как он не расширяет другой класс).