Может ли внутренний класс (inner class) в Java быть объявлен как private?

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

Ответ

Да, внутренний класс может быть private. Это ограничивает его видимость и использование только рамками внешнего класса, обеспечивая полную инкапсуляцию вспомогательной логики.

Пример:

public class DatabaseConnection {
    private Connection connection;

    // Приватный внутренний класс для логирования
    private class ConnectionLogger {
        void log(String event) {
            System.out.println("[" + new java.util.Date() + "] Connection " + connection + ": " + event);
            // Имеет доступ к private-полям внешнего класса
        }
    }

    public void connect() {
        // ... логика установки connection
        ConnectionLogger logger = new ConnectionLogger();
        logger.log("connected"); // Использование внутри внешнего класса
    }

    // Класс ConnectionLogger НЕВИДИМ снаружи
}

Последствия:

  • Компиляция: Попытка создать DatabaseConnection.ConnectionLogger из другого класса приведет к ошибке: 'ConnectionLogger' has private access in 'DatabaseConnection'.
  • Использование: Такой класс идеален для реализации деталей, которые являются частью внутреннего устройства внешнего класса и не должны быть частью его публичного API.
  • Доступ: Он имеет полный доступ к private полям и методам внешнего класса.