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

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

Ответ

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

Модификатор Класс Пакет (Package) Подкласс (Наследник) Остальной мир (World)
private Да Нет Нет Нет
default (package-private) Да Да Нет Нет
protected Да Да Да Нет
public Да Да Да Да

Пример и объяснение:

package com.example;

public class AccessModifiersDemo {
    private String secret = "Только внутри этого класса"; // private
    String packagePrivate = "Доступен в пакете com.example"; // default (package-private)
    protected String forSubclasses = "Доступен в пакете и подклассах"; // protected
    public String api = "Доступен отовсюду"; // public

    // private конструктор используется в Singleton или Factory
    private AccessModifiersDemo() {}
}

// Другой класс в том же пакете `com.example`
class SamePackageClass {
    void method() {
        AccessModifiersDemo demo = new AccessModifiersDemo();
        // demo.secret; // ОШИБКА: private недоступен
        System.out.println(demo.packagePrivate); // OK: default доступен в пакете
        System.out.println(demo.forSubclasses); // OK: protected доступен в пакете
        System.out.println(demo.api); // OK: public доступен везде
    }
}

Ключевые принципы:

  • Используйте самый строгий из возможных модификаторов. Начинайте с private и расширяйте доступ при необходимости.
  • Поля класса почти всегда должны быть private (инкапсуляция), доступ к ним — через public/protected геттеры/сеттеры.
  • public класс должен быть объявлен в отдельном файле с именем ClassName.java.
  • protected предоставляет доступ подклассам, даже если они находятся в другом пакете.