Может ли публичный метод быть частью конструктора в Java?

«Может ли публичный метод быть частью конструктора в Java?» — вопрос из категории Java Core, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, публичный метод не может быть частью конструктора в синтаксическом смысле. Конструктор — это специальный блок кода для инициализации нового объекта, а метод — это отдельный член класса.

Однако конструктор может вызывать публичные методы. Это часто считается плохой практикой, особенно если метод может быть переопределен в подклассе, так как объект на момент вызова еще не полностью проинициализирован.

Пример (проблемный):

public class Example {
    public Example() {
        initialize(); // Опасный вызов переопределяемого метода из конструктора
    }
    public void initialize() {
        System.out.println("Initializing...");
    }
}

public class SubExample extends Example {
    private String data;
    public SubExample() {
        super(); // Вызовет Example.constructor(), который вызовет initialize()
        data = "Loaded";
    }
    @Override
    public void initialize() {
        System.out.println("Initializing with " + data); // data == null!
    }
}

Рекомендация: Логику инициализации, которую можно переопределить, следует выносить из конструктора. Используйте фабричные методы или явные вызовы init() после полного создания объекта.