Защита доступа


Защита доступа

В предшествующих главах вы узнали о различных аспектах механизма управления доступом Java и его спецификаторах. Например, вы уже знаете, что доступ к приватному члену класса предоставляется только другим членам этого класса. Пакеты добавляют к управлению доступом еще одно измерение. Как вы вскоре убедитесь, Java предоставляет множество уровней защиты, обеспечивая очень точное управление видимостью переменных и методов внутри классов, подклассов и пакетов.

Классы и пакеты одновременно служат средствами инкапсуляции и хранилищем пространства имен и области определения переменных и методов. Пакеты играют роль контейнеров классов и других подчиненных пакетов. Классы служат контейнерами данных и кода. Класс — наименьшая единица абстракции Java. Вследствие взаимодействия между классами и пакетами Java определяет четыре категории видимости членов класса.

  • Подклассы в одном пакете.
  • Классы в одном пакете, не являющиеся подклассами.
  • Подклассы в различных пакетах.
  • Классы, которые не находятся в одном пакете и не являются подклассами.

Три спецификатора доступа — private, public и protected — предоставляют разнообразные способы создания множество уровней доступа, необходимых для этих категорий. Взаимосвязь между ними описана в табл. 9.1.

Хотя на первый взгляд механизм управления доступом Java может показаться сложным, следующие соображения могут облегчить его понимание. Любой компонент, объявленный как public, доступен из любого кода. Любой компонент, объявленный как private, не виден для компонентов, расположенных вне его класса. Если член не содержит явного спецификатора доступа, он видим подклассам и другим классам в данном пакете. Этот уровень доступа используется по умолчанию. Если нужно, чтобы элемент был виден за пределами его текущего пакета, но только классам, которые являются непосредственными подклассами данного класса, элемент должен быть объявлен как protected.

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

Таблица 9.1. Доступ к членам класса

  Private Модификатор отсутствует Protected Public
Один и тот же класс Да Да Да Да
Подкласс класса этого же пакета Нет Да Да Да
Класс этого же пакета, не являющийся подклассом Нет Да Да Да
Подкласс класса другого пакета Нет Нет Да Да
Класс другого пакета, не являющийся подклассом класса данного пакета Нет Нет Нет Да