Пример защиты доступа

Следующий пример демонстрирует использование всех комбинаций модификаторов управления доступом. Он содержит два пакета и пять классов. Не забудьте, что классы двух различных пакетов должны храниться в каталогах, имена которых совпадают с именами соответствующих пакетов — в данном случае pi и р2.

Исходный файл первого пакета определяет три класса Protection, Derived и SamePackage. Первый класс определяет четыре переменных int — по одной в каждом из допустимых режимов защиты доступа. Переменная п объявлена с уровнем защиты, используемым по умолчанию, n_pri — как private, n_pro — protected, a n_pub — public.

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

Второй класс, Derived — подкласс класса Protection этого же пакета pi. Он предоставляет классу Derived доступ ко всем переменным класса Protection, кроме переменной njori, объявленной как private. Третий класс, SamePackage, не является подклассом класса Protection, но он находится в этом же пакете и обладает доступом ко всем переменным, кроме переменной n_pri.

Файл Protection.java содержит следующий код:

package pi;
public class Protection {
int n = 1;
private int n_pri = 2;
protected int n_pro = 3;
public int n_pub = 4;
public Protection () {
System.out.println("конструктор базового класса");
System.out.println("n = " + n) ;
System.out.println("n_pri = " + n_pri);
System.out.println("n_pro = " + n_pro);
System.out.println("n_pub = " + n_pub);
}
}

Файл Derived. Java содержит такой код:

package pi;
class Derived extends Protection {
Derived () {
System.out.println("конструктор подкласса");
System.out.println("n = " + n); // доступно только для класса
System.out.println("n_pri = "4 + n_pri);
System.out.println("n_pro = " + n_pro);
System.out.println("n_pub = " + n_pub);
}
}

Файл SamePackage. j ava содержит следующий код:

package pi;
class SamePackage {
SamePackage() {
Protection p = new Protection () ;
System.out.println("конструктор этого же пакета");
System.out.println("n = " + p.n); // class only
System.out.println("n_pri = " + p.n_pri);
System.out.println("n_pro = " + p.n_pro);
System.out.println("n_pub = " + p.n_pub);
}
}

Ниже приведен исходный код второго пакета, р2. Два определенных в нем класса отражают оставшиеся две ситуации управления доступом. Первый класс, Protection2 — это подкласс класса pi.Protection. Он имеет доступ ко всем переменным класса pi. Protection, кроме n_pri (поскольку она объявлена как private) и п, которая объявлена с уровнем защиты, используемым по умолчанию. Вспомните, что заданный по умолчанию режим доступа разрешает доступ из данного класса или пакета, но не из подклассов другого пакета. И, наконец, класс OtherPackage имеет доступ только к одной переменной — n_pub, которая была объявлена как public.

Файл Protection2.Java содержит следующий код:

package р2;
class Protection2 extends pi.Protection {
Protection2 () {
System.out.println("унаследованный конструктор другого пакета");
//доступно только для данного класса или пакета System.out.println("n = " + n); //доступно только для данного класса
System, out.println("n_pri = " + n_pri);
System.out.println("n_pro = " + n_pro);
System.out.println("n_pub = " + n_pub);
}
}

Файл OtherPackage .java содержит следующий код:

package p2;
class OtherPackage {
OtherPackage() {
pi.Protection p = new pi.Protection();
System.out.println("конструктор другого пакета"); //доступно только для данного класса или пакета
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_pub = " + p.n_pub);
}
}

Для проверки работы этих двух пакетов можно использовать следующие два тестовых файла. Тестовый файл для пакета pi имеет вид:

// Демонстрационный пакет pi.
package pi; // Конкретизация различных классов пакета
pi.public class Demo {
public static void main(String args[]) {
Protection obi = new Protection () ;
Derived ob2 = new Derived ();
SamePackage ob3 = new SamePackage();
}
}

Следующий файл — тестовый файл пакета р2:

// Демонстрационный пакет р2.
package р2;
// Конкретизация различных классов пакета
р2.public class Demo {
public static void main(String args[]) {
Protection2 obi = new Protection2() ;
OtherPackage ob2 = new OtherPackage() ;
}
}