Должны ли все методы абстрактного класса в Java быть публичными (public)?

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

Ответ

Нет. Методы абстрактного класса могут иметь любые модификаторы доступа: public, protected или private (а также доступ по умолчанию, package-private).

Правила:

  1. Абстрактные методы (без реализации) не могут быть private или final, так как их цель — быть переопределёнными в подклассах. Они могут быть public, protected или package-private.
  2. Конкретные методы (с реализацией) могут иметь любой модификатор доступа, включая private.

Почему это важно: Абстрактный класс часто содержит общую логику (шаблонный метод), где часть функционала скрыта (private), часть доступна наследникам (protected), а часть — внешнему коду (public).

Пример:

abstract class DataProcessor {
    // Публичный абстрактный метод - контракт для клиента
    public abstract String processData(String input);

    // Protected метод - вспомогательная логика для наследников
    protected String sanitizeInput(String input) {
        return input.trim();
    }

    // Private метод - внутренняя реализация, скрытая от всех
    private void logProcessing() {
        System.out.println("Processing started...");
    }

    // Публичный шаблонный метод, использующий все вышеперечисленные
    public final String execute(String input) {
        logProcessing();
        String cleanInput = sanitizeInput(input);
        return processData(cleanInput);
    }
}