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

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

Ответ

Нет, абстрактный метод не может быть приватным (private).

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

Допустимые модификаторы доступа для абстрактных методов:

  • protected (по умолчанию в большинстве языков, если не указано иное) — метод виден в классе-родителе и во всех наследниках.
  • public — метод виден везде.

Пример на Java:

abstract class Animal {
    // Допустимо: protected абстрактный метод
    abstract protected void makeSound();
    // Допустимо: public абстрактный метод
    abstract public void eat();
    // НЕДОПУСТИМО: private абстрактный метод (ошибка компиляции)
    // abstract private void sleep();
}

class Dog extends Animal {
    @Override
    protected void makeSound() {
        System.out.println("Woof!");
    }

    @Override
    public void eat() {
        System.out.println("Dog is eating.");
    }
}

Важно: Сам абстрактный класс может иметь приватные неабстрактные методы для собственной внутренней логики, но они не являются частью контракта для наследников.