Что такое модификаторы доступа (видимости) в Java?

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

Ответ

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

Модификатор Видимость внутри класса Видимость внутри пакета Видимость для наследников (вне пакета) Видимость везде
private Да Нет Нет Нет
(по умолчанию) Да Да Нет Нет
protected Да Да Да Нет
public Да Да Да Да

Пример и пояснение:

package com.example;

public class AccessExample {
    private String secret = "visible only inside AccessExample"; // Наиболее строгий
    String packagePrivate = "visible within com.example package";
    protected String forSubclasses = "visible in package and to subclasses";
    public String api = "visible to everyone"; // Наиболее открытый

    public void method() {
        System.out.println(secret); // OK: доступ внутри класса
    }
}

// В другом пакете
package com.other;
import com.example.AccessExample;

class OtherClass {
    void test() {
        AccessExample obj = new AccessExample();
        // obj.secret; // Ошибка компиляции: private
        // obj.packagePrivate; // Ошибка: доступ только в пакете com.example
        // obj.forSubclasses; // Ошибка: не наследник и не в том же пакете
        System.out.println(obj.api); // OK: public
    }
}

Выбор модификатора — ключевой элемент инкапсуляции, позволяющий скрывать внутреннюю реализацию и предоставлять чёткий API.