Конструкторы при наследовании. Ключевое слово 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, "Овчарка");
    }
}

Давайте разберем ключевые моменты о конструкторах при наследовании:

  1. Ключевое слово super:
  2. Используется для вызова конструктора родительского класса
  3. Должно быть первым оператором в конструкторе
  4. Может принимать параметры в соответствии с конструктором родительского класса

  5. Важные правила:

  6. Если в конструкторе явно не указан вызов super(), компилятор автоматически добавляет вызов конструктора без параметров
  7. Если в родительском классе нет конструктора по умолчанию, в дочернем классе обязательно нужно явно вызывать один из существующих конструкторов через super

  8. Порядок выполнения при создании объекта:

  9. Сначала вызывается конструктор родительского класса
  10. Затем выполняется инициализация полей дочернего класса
  11. В конце выполняется тело конструктора дочернего класса

  12. Типичные случаи использования:

  13. Инициализация унаследованных полей через родительский конструктор
  14. Добавление специфичной для подкласса инициализации
  15. Переопределение параметров инициализации