Какие модификаторы доступа существуют в Java и как они работают?

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

Ответ

Модификаторы доступа в Java определяют область видимости (доступность) классов, методов, полей и конструкторов. Они являются ключевым механизмом инкапсуляции.

Четыре уровня доступа (от самого слабого к самому строгому):

Модификатор Видимость внутри класса Видимость внутри пакета Видимость для подклассов (наследников) Видимость везде
private
default (package-private)
(когда модификатор не указан)
protected
public

Примеры и типичное применение:

// 1. public - доступ отовсюду. Используется для API.
public class ApiService {
    public void publicMethod() { /* ... */ }
}

// 2. protected - доступ в пакете и для наследников.
class BaseClass {
    protected void helperMethod() { /* Для внутренней логики наследников */ }
}

// 3. default (package-private) - доступ только внутри пакета.
// Идеально для скрытия внутренней реализации пакета.
class PackagePrivateHelper { // Модификатор не указан
    void packageMethod() { /* ... */ }
}

// 4. private - доступ только внутри своего класса.
// Основа инкапсуляции, скрытие деталей реализации.
class BankAccount {
    private double balance; // Прямой доступ извне запрещён

    public double getBalance() { // Доступ через public-метод (геттер)
        return balance;
    }
}

Правила для классов:

  • В одном файле может быть только один public-класс, и его имя должно совпадать с именем файла.
  • Классы верхнего уровня могут быть только public или default (package-private).