Какие модификаторы доступа есть в Java
Что проверяют
Знаете ли вы четыре уровня и понимаете ли, что protected включает видимость на уровне пакета.
Как отвечать
Уровней четыре, от узкого к широкому:
private: только внутри своего класса (включая вложенные);- без модификатора, видимость на уровне пакета: внутри своего пакета. Это значение по умолчанию, у него нет ключевого слова;
protected: свой пакет плюс наследники в других пакетах. Именно включение пакета обычно и забывают;public: везде.
Особенности применения:
- класс верхнего уровня может быть только публичным или пакетным. Внутри публичного файла публичный класс должен совпадать по имени с файлом;
- вложенные классы могут иметь любой модификатор;
- в интерфейсе методы публичны по умолчанию, поля являются публичными статическими константами. С Java 9 в интерфейсах разрешены приватные методы для вынесения общей части реализаций по умолчанию;
- при переопределении нельзя сузить видимость: метод, объявленный публичным в родителе, не может стать защищённым в наследнике. Расширить можно.
Важное современное дополнение: система модулей из Java 9 добавила ещё один слой. Публичный класс виден снаружи модуля только если его пакет явно экспортирован. То есть слово public перестало означать «доступно всем», и это позволяет иметь публичные классы для внутреннего использования модуля.
Практическое правило: минимальная видимость по умолчанию. Поля приватные, доступ через методы, если он вообще нужен. Расширять видимость легко, сужать в опубликованном API почти невозможно.
Отдельная мысль про protected: это часть контракта для наследников, а значит часть публичного API. Защищённое поле означает обязательство поддерживать его в следующих версиях, поэтому его выставляют осознанно.
Где спотыкаются
Считают, что protected доступен только наследникам.
Делают поля публичными ради удобства.
Не знают про видимость на уровне пакета и всегда пишут public.
Пытаются сузить видимость метода при переопределении.