Материал предоставлен https://it.rfei.ru

Модификаторы доступа для классов и интерфейсов верхнего уровня

Классы и интерфейсы верхнего уровня из пакета могут быть объявлены как общедоступные (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. В примере приведены два способа, в которых класс обращается к классам из других пакетов.

  1. Обозначить класс его полным составным именем, как показано в строке (4). (wizard.pandorasBox.artifacts.Ailment).
  2. Импортировать класс явно из пакета wizard.pandorasBox.artifacts, как показано в строке (2), и использовать краткое имя класса Ailment, как в строке (5).

В файле Baldness.java в строке (9) класс LovePotion желает реализовать интерфейс Magic из пакета wizard.pandorasBox, но не может сделать этого, хотя файл из этого пакета импортируется. Причина в том, что интерфейс Magic имеет доступ по умолчанию и поэтому к нему можно обратиться только внутри пакета wizard.pandorasBox.

Из того, что класс доступен, не следует также доступность его членов. Управление доступом к члену выполняется отдельно от класса.

Таблица 4.2. Сводная таблица модификаторов доступа для классов и интерфейсов

Модификаторы Классы и интерфейсы верхнего уровня
default (без модификатора) Доступен в своём пакете (пакетный доступ)
public Доступен отовсюду
ПакетыДругие модификаторы для классов