Программирование на языке Java

         

Ограничение доступа



Ограничение доступа

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

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

В языке Java имеется три уровня доступа, определяемых ключевыми словами: private (закрытый), public (открытый) и protected (защищенный), которые употребляются в различных комбинациях. Содержимое ячеек таблицы определяет доступность переменной с данной комбинацией модификаторов (столбец) из указанного места (строка).

privateмодификатор отсутствуетprivate protectedprotectedpublic
тот же классдадаДадада
подкласс в том же пакетенетдаДадада
независимый класс в том же пакетенетдаНетдада
подкласс в другом пакетенетнетДадада
независимый класс в другом пакетенетнетНетнетда

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

Ниже приведен довольно длинный пример, в котором представлены все допустимые комбинации модификаторов уровня доступа. В исходном коде первого пакета определяется три класса: Protection, Derived и SamePackage. В первом из этих классов определено пять целых переменных - по одной на каждую из возможных комбинаций уровня доступа. Переменной n приписан уровень доступа по умолчанию, n_pri - уровень private, n_pro - protected, n_pripro - private protected и n_pub - public. Во всех остальных классах мы пытаемся использовать переменные первого класса. Те строки кода, которые из-за ограничения доступа привели бы к ошибкам при трансляции, закомментированы с помощью однострочных комментариев (//) - перед каждой указано, откуда доступ при такой комбинации модификаторов был бы возможен. Второй класс - Derived - является подклассом класса Protection и расположен в том же пакете р1. Поэтому ему доступны все перечисленные переменные за исключением n_pri. Третий класс, SamePackage, расположен в том же пакете, но при этом не является подклассом Protection. По этой причине для него недоступна не только переменная n_pri, но и n_pripro, уровень доступа которой - private protected. package р1; public class Protection { int n = 1; private int n_pri = 2; protected int n_pro = 3; private protected int n_pripro = 4; public int n_pub = 5; public Protection() { System.out.println("base constructor"); System.out.println("n="+n); System.out.println("n_pri="+n_pri); System.out.println("n_pro="+n_pro); System.out.println("n_pripro="+n_pripro); System.out.println("n_pub="+n_pub); } } class Derived extends Protection { Derived() { System.out.println("derived constructor"); System.out.println("n = " + n); // только в классе // System.out.println("n_pri="+n_pri); System.out.println("n_pro="+n_pro); System.out.println("n_pripro="+n_pripro); System.out.println("n_pub="+n_pub); } } class SamePackage { SamePackage() { Protection p = new Protection(); System.out.println("same package constructor"); System.out.println("n="+p.n); // только в классе // System.out.println("n_pri="+p.n_pri); System.out.println("n_pro="+p.n_pro); // только в классе и подклассе // System.out.println("n_pripro="+p.n_pripro): System.out.println("n_pub="+p.n_pub): } }



Содержание раздела