1 июл. 2015 г.

Модификаторы доступа.

Здесь мы постараемся рассмотреть почти все случаи применения модификаторов доступа. Исключение составят лишь их применение для вложенных (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. Далее приведу просто скрины этих классов и результат работы программы:

P0010

P0011

P0012

 

 

P0013

P0014

P0015

 

 

Тут все достаточно просто и объяснять достаточно все это ленно. Если не понятно пишите вопросы в комментах.

4 комментария:

  1. Хорошо написано. Откуда брали информацию случайно не отсюда http://proglang.su/java/143 про модификаторы доступа?

    ОтветитьУдалить
  2. Спасибо. Нет не от туда. Из родной документации по Java + личный опыт.

    ОтветитьУдалить
  3. Только удосужился посмотреть приведенный вами линк. Там, кстати, полно ошибок. Вот например от туда: "Методы, объявленные как private для всех не наследуются, так что нет никакого правила для них" Это распространенное заблуждение. Наследуется все. Я даже напишу отдельную статью по этому поводу.

    ОтветитьУдалить
  4. Добрый день! У Вас на скрине ошибка (опечатка):
    должно быть так:
    ```
    // использование членов класса 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());

    ОтветитьУдалить