Классы и интерфейсы верхнего уровня из пакета могут быть объявлены как общедоступные (public
). Это значит, что к ним можно получить доступ отовсюду, как изнутри, так и извне их пакета. Если модификаторы доступа опущены, то классы и интерфейсы становятся доступны только в пакете, к ним нельзя обратиться из других пакетов или подпакетов. Такой доступ называется пакетным или доступом по умолчанию.
Пример 4.7. Модификаторы доступа для классов и интерфейсов
// Файл: Clown.java
package wizard.pandorasBox; // (1) Объявление пакета
import wizard.pandorasBox.artifacts.Ailment; // (2) Импорт класса
public class Clown implements Magic {
LovePotion tlc; // (3) Класс в том же пакете
wizard.pandorasBox.artifacts.Ailment problem;// (4) Полное составное имя класса
Clown() {
tlc = new LovePotion("passion");
problem = new Ailment("flu"); // (5) Сокращенное имя класса
}
public void levitate() { System.out.println("Levitating"); }
public void mixPotion() { System.out.println("Mixing " + tlc); }
public void healAilment() { System.out.println("Healing " + problem); }
public static void main(String[] args) { // (6)
Clown joker = new Clown();
joker.levitate();
joker.mixPotion();
joker.healAilment();
}
}
interface Magic { void levitate(); } // (7)
package wizard.pandorasBox; // (1) Объявление пакета
public class LovePotion { // (2) Доступность снаружи пакета
String potionName;
public LovePotion(String name) { potionName = name; }
public String toString() { return potionName; }
}
// File: Ailment.java
package wizard.pandorasBox.artifacts; // (1) Объявление пакета
public class Ailment { // (2) Доступность снаружи пакета
String ailmentName;
public Ailment(String name) { ailmentName = name; }
public String toString() { return ailmentName; }
}
// File: Baldness.java
package wizard.spells; // (1) Объявление пакета
import wizard.pandorasBox.*; // (2) Импорт классов/интерфейсов
import wizard.pandorasBox.artifacts.*; // (3) Импорт из подпакета
public class Baldness extends Ailment { // (4) Сокращенное имя класса Ailment
wizard.pandorasBox.LovePotion tlcOne; // (5) Полное составное имя класса
LovePotion tlcTwo; // (6) Класс в том же пакете
Baldness(String name) {
super(name);
tlcOne = new wizard.pandorasBox. // (7) Полное составное имя класса
LovePotion("romance");
tlcTwo = new LovePotion(); // (8) Класс в том же пакете
}
}
class LovePotion // implements Magic // (9) Не доступен
{ public void levitate(){} }
В результате компиляции и выполнения программы из текущей рабочей директории будет получено следующее:
>javac -d . Clown.java Ailment.java Baldness.java
>java wizard.pandorasBox.Clown
Levitating
Mixing passion
Healing flu
В примере 4.7 класс Clown
и интерфейс Magic
размещаются в пакете wizard.pandorasBox
. Общедоступный (public
) класс Clown
доступен отовсюду. Интерфейс Magic
имеет доступ по умолчанию, поэтому к нему можно обратиться только внутри пакета wizard.pandorasBox
. Он недоступен из других пакетов, даже из тех, которые вложены в этот пакет.
Класс LovePotion
также размещается в пакете wizard.pandorasBox
. Класс имеет модификатор public, поэтому доступен из других пакетов. Два файлаClown.java
и LovePotion.java
демонстрируют то, как можно использовать несколько модулей компиляции, чтобы объединить классы в один пакет.
Класс Clown
из файла Clown.java
использует класс Ailment
. В примере приведены два способа, в которых класс обращается к классам из других пакетов.
wizard.pandorasBox.artifacts.Ailment
).
wizard.pandorasBox.artifacts
, как показано в строке (2), и использовать краткое имя класса Ailment
, как в строке (5).
В файле Baldness.java
в строке (9) класс LovePotion
желает реализовать интерфейс Magic
из пакета wizard.pandorasBox
, но не может сделать этого, хотя файл из этого пакета импортируется. Причина в том, что интерфейс Magic
имеет доступ по умолчанию и поэтому к нему можно обратиться только внутри пакета wizard.pandorasBox
.
Из того, что класс доступен, не следует также доступность его членов. Управление доступом к члену выполняется отдельно от класса.
Модификаторы | Классы и интерфейсы верхнего уровня |
---|---|
default (без модификатора) | Доступен в своём пакете (пакетный доступ) |
public | Доступен отовсюду |
Пакеты | Другие модификаторы для классов |