Здесь мы постараемся рассмотреть почти все случаи применения модификаторов доступа. Исключение составят лишь их применение для вложенных (nested) и внутренних (inner) классов, а так же для интерфейсов, так как эти темы мы еще пока не рассматривали.
Классы и пакеты используемы совместно с модификаторами доступа служат средствами инкапсуляции, то есть средствами сокрытия деталей реализации за простым интерфейсом.
Модификаторы доступа могут применяться как к классам, так и их членам – полям и методам. Всего существует четыре модификатора доступа и тут приведем их краткое описание, потом рассмотрим каждый подробно.
- public – любой компонент, объявленный как public, доступен из любого кода
- protected – разрешает доступ к компоненту в пределах пакета и классам наследникам
- private – разрешает доступ к компоненты в пределах класса
- по умолчанию (нет ключевого слова) – разрешает доступ к компонентам в пределах пакета
Классы наследники – это классы унаследованные от какого-либо класса. Наследование мы пока еще не изучали.
Доступ к классам
По умолчанию классы верхнего уровня доступны в том пакете, в котором они определены. Впрочем, если класс верхнего уровня объявлен как public, то он доступен везде (или везде, где доступен сам пакет). Мы ограничили это утверждение классами верхнего уровня, потому что классы могут быть объявлены как члены других классов. Так как эти внутренние классы являются членами класса, то они подчиняются правилам контроля доступа к членам класса.
Доступ к членам класса
Члены класса всегда доступны внутри тела класса. По умолчанию члены класса также доступны в пакете, в котором класс определен.
Модификатор public
Для класса, не являющегося вложенным, может быть указан только один из двух возможных уровней доступа: заданный по умолчанию и public. Когда класс объявлен как public, он должен быть единственным public классом, объявленным в файле, и имя файла должно совпадать с именем класса.
Как public могут быть объявлены классы, поля, методы и конструкторы.
Модификатор protected
Этот модификатор мы подробно рассмотрим в теме наследования классов. Если же наследование не используется, то данный модификатор работает, так же как и модификатор по умолчанию.
Единственно что сейчас можно кратко сказать, что к компонентам объявленным как protected, будет иметь доступ любой дочерний класс из любого пакета или любой класс из того же пакета.
Как protected могут быть объявлены поля, методы, конструкторы, вложенные классы и вложенные интерфейсы.
Классы и интерфейсы верхнего уровня не могут быть объявлены как protected.
Модификатор private
Это самый жесткий по ограничению доступа модификатор. Элементы объявленные как private доступны только внутри этого же класса и ни кому вне класса.
Как private могут быть объявлены поля, методы, конструкторы, вложенные классы и вложенные интрефесы.
Классы и интерфейсы верхнего уровня не могут быть объявлены как private.
Модификатор private рекомендуется применять к полям классов, дабы их можно было изменить только с помощью методов класса, а не на прямую.
По существу, модификаторы доступа, это простая тема, но мы к нем еще будем возвращаться. Пока это было просто знакомство. И теперь немного практики…
Я создал классы Mod02.java, DefMod.java, ProMod.java и PrvMod.java которые принадлежат пакету pro.java.pkg002, а так же класс PubMod.java, принадлежащий пакету pro.java.pkg003. Далее приведу просто скрины этих классов и результат работы программы:
Тут все достаточно просто и объяснять достаточно все это ленно. Если не понятно пишите вопросы в комментах.
Хорошо написано. Откуда брали информацию случайно не отсюда http://proglang.su/java/143 про модификаторы доступа?
ОтветитьУдалитьСпасибо. Нет не от туда. Из родной документации по Java + личный опыт.
ОтветитьУдалитьТолько удосужился посмотреть приведенный вами линк. Там, кстати, полно ошибок. Вот например от туда: "Методы, объявленные как private для всех не наследуются, так что нет никакого правила для них" Это распространенное заблуждение. Наследуется все. Я даже напишу отдельную статью по этому поводу.
ОтветитьУдалитьДобрый день! У Вас на скрине ошибка (опечатка):
ОтветитьУдалитьдолжно быть так:
```
// использование членов класса PrvMod
PrvMod pm1 = new PrvMod();
println("pm1.getPrvInt = " + pm1.getPrvInt());
PrvMod pm2 = new PrvMod();
pm2.setPrvInt(108);
println("pm2.getPrvInt = " + pm2.getPrvInt());
```
а у Вас: println("pm1.getPrvInt = " + pm1.getPrvInt());