Модификаторы управления доступом и области видимости.

20-01-2020

Область видимости – это область программы, в пределах которой идентификатор некоторой переменной, метода или класса является связанным с этой переменной, соответственно, методом или классом. За пределами области видимости тот же самый идентификатор может быть связан с другими переменными, методами, классами.

Видимость поля означает, что его можно использовать в выражениях, передавать в качестве аргумента в методы, изменять его значение с помощью присваивания.

Видимость метода означает возможность его вызова.

Пакет – это пространство имен, в котором организовано множество классов и/или интерфейсов. Уровень доступа определяет, могут ли другие классы использовать определенные поля или вызывать определенный метод.

Класс может быть объявлен с модификатором public, и в этом случае он виден во всех классах везде. Если класс, не являющийся внутренним, не имеет модификатора доступа, то, по умолчанию, класс доступен в том пакете, в котором он объявлен. Если класс является внутренним классом, то, поскольку он является членом внешнего класса, то доступ к нему подчиняется правилам доступа для членов класса. Для членов класса также можно использовать модификатор public или не использовать никакого идентификатора (доступ по умолчанию). В этих случаях действуют такие же правила, как для класса. Для членов класса определены два дополнительных модификатора – private и protected.

Итак, модификаторы доступа используются для управления видимостью класса или членов класса – полей и методов:

1) public: класс, переменная или метод доступны всем другим объектам в системе;

2) private: класс, переменная или метод доступны только внутри класса, в котором они объявлены. Любой другой класс из того же пакета не будет иметь доступа к этим членам класса. Классы и интерфейсы не могут быть объявлены как private;

3) default (модификатор, по умолчанию): если перед именем класса, метода или переменной отсутствует модификатор доступа, то применяется доступ по умолчанию – default. В этом случае члены класса видны только внутри пакета (если класс будет объявлен таким образом, то он тоже будет доступен только внутри пакета);

4) protected: члены класса (поля и методы) доступны только внутри пакета и в наследниках данного класса в других пакетах.

Модификаторы доступа и уровень доступа

Модификатор доступа Класс Пакет Подкласс, в том числе в других пекетах Остальная часть программы, в том числе другие пакеты
public Да Да Да Да
protected Да Да Да Нет
Без модификатора (доступ по умолчанию) Да Да Нет Нет
private Да Нет Нет Нет

UML нотация: В UML нотации члены класса с различными модификаторами отображаются следующими знаками:

  • public – “+”;
  • protected – “#”;
  • private – “-“;
  • без модификатора – “~”.

Остановимся пока на двух методах управления доступом – public и private. Например, в приведенном примере класса Circle переменная radius объявлена как private. В результате radius доступен внутри класса Circle, но не доступен внутри класса TestCircle, другими словами, вы не можете использовать “c1.radius” для обращения к радиусу c1 в TestCircle. С другой стороны, в классе Circle определен public метод getRadius(), следовательно, он может быть вызван в классе TestCircle.

Сокрытие информации и инкапсуляция

Класс инкапсулирует имя, статические атрибуты и динамическое поведение как бы в «ящике». После того как класс определен, можно запечатать «ящик» и поставить его на «полку» для других пользователей или повторного использования. Любой пользователь может распечатать «ящик» и использовать его в своих приложениях. Это невозможно в процедурно ориентированных языках программирования.

Инкапсуляция – это один из основных принципов объектно ориентированного программирования. Это принцип, который требует сокрытия деталей реализации используемого программного компонента при возможности взаимодействовать с ним посредством предоставляемого интерфейса, а также объединение и защита жизненно важных для компонента данных. При этом пользователю предоставляется только спецификация (интерфейс) объекта. Пользователь может взаимодействовать с объектом только через этот интерфейс.

Для реализации этого принципа переменные-члены класса обычно скрываются от внешнего мира (т.е. для других классов) посредством использования модификатора доступа private, а доступ к переменным-членам осуществляется посредством специальных public методов, как, например, getRadius() и getColor().

Это требуется в соответствии с принципом сокрытия информации. Так, объекты взаимодействуют друг с другом, используя хорошо организованные интерфейсы. Объектам не разрешено знать детали реализации других объектов. Детали реализации скрываются, или инкапсулируются, внутри класса. Сокрытие информации способствует повторному использованию класса.

Правило. Никогда не используйте модификатор public для переменной, если для этого нет сто́ящей причины.

Литература

  1. О.И. Гуськова, "ООП в Java", Москва, 2018