В Java для управления доступом к полям, методам и классам используются модификаторы доступа: private, default (package-private), protected, public.
История вопроса:
Ранние версии Java использовали строгую объектную инкапсуляцию. Для гибкости были введены разные уровни доступа для поддержки как полной закрытости, так и расширяемости (наследования и доступа в рамках пакета).
Проблема:
Неправильный выбор модификатора может привести к нарушению инкапсуляции, проблемам с наследованием, невозможности тестирования или даже к security-багам, если данные становятся общедоступными по ошибке.
Решение:
Используйте самый закрытый модификатор, который допускает ваша архитектура. Поля обычно делают private, обеспечивая доступ к ним через getter/setter. Методы делают public только если они часть API, а для расширения — protected.
Пример кода:
public class Person { private String name; // закрытое поле protected int age; // доступно в пакете и наследниках String email; // package-private public String getName() { return name; } }
Ключевые особенности:
private — доступен только внутри классаprotected — плюс доступ наследникам даже из других пакетовpublic — доступен всемМожно ли применить модификатор доступа к локальным переменным?
Нет. Модификаторы доступа применяются только к классам, методам и полям/вложенным классам, но не к локальным переменным.
Можно ли сделать класс внутри метода с модификатором public?
Нет. Локальный класс не может быть объявлен с модификатором доступа, он всегда имеет область видимости внутри метода.
Доступен ли protected-член дочернему классу в другом пакете?
Да, protected-члены доступны наследникам, даже если они находятся в других пакетах, но не обычным классам в другом пакете.
Все поля класса случайно объявлены public — к ним обращаются напрямую из других классов, сложно отследить место изменений.
Плюсы:
Минусы:
Все поля private, а публичные методы контролируют доступ с валидацией, только нужные части делают protected для расширения в наследниках.
Плюсы:
Минусы: