Модификаторы доступа и инкапсуляция

Все члены класса в языке Java — поля и методы, свойства — имеют модификаторы доступа. В прошлых темах мы уже сталкивались с модификатором public. Модификаторы доступа позволяют задать допустимую область видимости для членов класса, то есть контекст, в котором можно употреблять данную переменную или метод.

В Java используются следующие модификаторы доступа:

  • public: публичный, общедоступный класс или член класса. Поля и методы, объявленные с модификатором public, видны другим классам из текущего пакета и из внешних пакетов.
  • private: закрытый класс или член класса, противоположность модификатору public. Закрытый класс или член класса доступен только из кода в том же классе.
  • protected: такой класс или член класса доступен из любого места в текущем классе или пакете или в производных классах, даже если они находятся в других пакетах
  • Модификатор по умолчанию (default). Отсутствие модификатора у поля или метода класса предполагает применение к нему модификатора по умолчанию. Такие поля или методы видны всем классам в текущем пакете.

Рассмотрим все возможные случаи. Допустим, у нас есть проект со следующей структурой:

инкапсуляция

В данном случае имеется три пакета. Пакет encapsulation содержит главный класс программы, в котором и прописан метод main. Его мы трогать не будем.

И также определены два пакета encapsulation .package1, который содержит классы ClassA и ClassB, и пакет encapsulation .package2, который содержит классы ClassC и ClassD.

Класс ClassA содержит весь возможный набор модификаторов доступа:

Модификатор доступа должен предшествовать остальной часть определения переменной или метода.

Пусть класс ClassB использует ClassA:

Так как классы ClassB и ClassA находятся в одном пакете, то мы сможем использовать все поля и методы класса ClassA в ClassB кроме тех, что объявлены как private.

Теперь используем класс ClassA в классе ClassC:

Так как класс ClassC находится в другом пакете и не является наследником класса ClassA, то в нем можно использовать только те поля и методы класса ClassA, которые объявлены с модификатором public.

И последний случай — ClassD является наследником класса ClassA, но находится в другом пакете (чуть позже мы более подробно разберем наследование):

Так как ClassD — наследник класса ClassA, то мы можем напрямую использовать методы и поля ClassA без создания объекта. И здесь нам опять недоступны поля и методы private, и также нам недоступны поля и методы с модификатором доступа по умолчанию. В то же время в отличие от находящегося в том же пакете класса ClassC в классе ClassD мы можем использовать методы и поля с доступом protected.

Инкапсуляция

Казалось бы, почему бы не объявить все переменные и методы с модификатором public? Однако использование различных модификаторов гарантирует, что данные не будут искажены или изменены не надлежащим образом. Подобное сокрытие данных называется инкапсуляцией.

А вместо непосредственного использования полей, как правило, используют методы доступа:

И затем вместо непосредственной работы с полем name в классе Book мы будем работать с методами, которые устанавливает значение этого поля и возвращают его.

Подписаться
Уведомлять о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x