Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
30 Май 2023
2 мин
65

Проблема вызова переопределяемых методов в конструкторах в Java

Существует распространённая проблема в Java, которая связана с вызовом переопределяемых методов в конструкторах. Эта проблема часто встречается у

Существует распространённая проблема в Java, которая связана с вызовом переопределяемых методов в конструкторах. Эта проблема часто встречается у новичков, которые только начинают познавать основы языка. Давайте разберемся, что же не так с этим подходом на примере.

public abstract class Animal {
    public Animal() {
        makeSound();
    }

    public void makeSound() {
        System.out.println("Animal sound");
    }
}

public class Dog extends Animal {
    private String sound;

    public Dog() {
        sound = "Woof";
    }

    @Override
    public void makeSound() {
        System.out.println(sound);
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog();
    }
}

В этом коде класс Dog наследует от Animal и переопределяет метод makeSound(). В конструкторе Animal вызывается этот метод. Когда создается новый объект Dog, сначала вызывается конструктор Animal, в котором вызывается переопределенный метод makeSound(). Но переменная sound в Dog еще не проинициализирована, поэтому выводится null вместо "Woof".

Здесь как раз и проявляется проблема вызова переопределяемых методов в конструкторе. При создании объекта подкласса, конструктор сначала вызывает конструктор суперкласса. Если в конструкторе суперкласса вызывается переопределяемый метод, то будет вызвана версия этого метода из подкласса. Но так как инициализация полей подкласса еще не произошла, это может привести к непредсказуемым результатам или ошибкам.

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

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий