Конструкторы при наследовании. Ключевое слово super
Я помогу вам подготовить материал о конструкторах при наследовании в Java.
// 1. Базовый класс с конструкторами
class Animal {
private String name;
private int age;
// Конструктор по умолчанию
public Animal() {
System.out.println("Вызван конструктор Animal по умолчанию");
}
// Параметризованный конструктор
public Animal(String name, int age) {
this.name = name;
this.age = age;
System.out.println("Вызван параметризованный конструктор Animal");
}
}
// 2. Класс-наследник
class Dog extends Animal {
private String breed;
// Конструктор по умолчанию
public Dog() {
// Неявный вызов super()
System.out.println("Вызван конструктор Dog по умолчанию");
}
// Параметризованный конструктор с вызовом super()
public Dog(String name, int age, String breed) {
super(name, age); // Явный вызов конструктора родительского класса
this.breed = breed;
System.out.println("Вызван параметризованный конструктор Dog");
}
}
// 3. Пример использования
class Main {
public static void main(String[] args) {
System.out.println("=== Создание объекта Dog без параметров ===");
Dog dog1 = new Dog();
System.out.println("\n=== Создание объекта Dog с параметрами ===");
Dog dog2 = new Dog("Рекс", 3, "Овчарка");
}
}
Давайте разберем ключевые моменты о конструкторах при наследовании:
- Ключевое слово
super
: - Используется для вызова конструктора родительского класса
- Должно быть первым оператором в конструкторе
-
Может принимать параметры в соответствии с конструктором родительского класса
-
Важные правила:
- Если в конструкторе явно не указан вызов
super()
, компилятор автоматически добавляет вызов конструктора без параметров -
Если в родительском классе нет конструктора по умолчанию, в дочернем классе обязательно нужно явно вызывать один из существующих конструкторов через
super
-
Порядок выполнения при создании объекта:
- Сначала вызывается конструктор родительского класса
- Затем выполняется инициализация полей дочернего класса
-
В конце выполняется тело конструктора дочернего класса
-
Типичные случаи использования:
- Инициализация унаследованных полей через родительский конструктор
- Добавление специфичной для подкласса инициализации
- Переопределение параметров инициализации