Права доступа к членам класса
Как видно из листинга 3.1, в пакете недоступны только закрытые, private, поля другого класса.
В файле Inp2.java описаны два класса: inp2 и класс Derivedp2, расширяющий класс base. Эти классы находятся в другом пакете р2. В этих классах тоже сделана попытка обращения к полям класса вазе. Неудачные попытки прокомментированы сообщениями компилятора. Листинг 3.2 показывает содержимое этого файла.
Напомним, что класс вазе должен быть помечен при своем описании в пакете p1 модификатором public, иначе из пакета р2 не будет видно ни одного его члена.
Листинг 3.2. Файл Inp2.java с описанием пакета р2.
package p2; import pl.Base; class Inp2{ public static void main(String[] args){ Base b = new Base(); // b.priv = 1; // "priv has private access in pl.Base" // b.pack = 1; // "pack is not public in pl.Base; // cannot be accessed from outside package" // b.prot = 1; //""prot has protected access in pi.Base" b.publ = 1; } } class Derivedp2 extends Base{ public void, f (Base a){ // a.priv = 1; // "priv has private access in .p1.Base" // a.pack = 1; // "pack, is not public in pi.Base; cannot //be accessed from outside package" // a.prot = 1; // "prot has protected access in p1.Base" a.publ = 1; // priv = 1; // "priv has private access in pi.Base" // pack = 1; // "pack is not public in pi.Base; cannot // be accessed from outside package" prot = 1; publ = 1; super.prot = 1; } }
Здесь, в другом пакете, доступ ограничен в большей степени.
Из независимого класса можно обратиться только к открытым, public, полям класса другого пакета. Из подкласса можно обратиться еще и к защищенным, protected, полям, но только унаследованным непосредственно, а не через экземпляр суперкласса.
Все указанное относится не только к полям, но и к методам. Подытожим все сказанное в табл. 3.1.
Таблица 3.1. Права доступа к полям и методам класса.
Класс | Пакет | Пакет и подклассы | Все классы | |
---|---|---|---|---|
private | + | |||
"package" | + | + | ||
protected | + | + | * | |
public | + | + | + | + |
Особенность доступа к protected-полям и методам из чужого пакета отмечена звездочкой.