Есть несколько правил, которые помогут вам разобраться. Элемент, объявленный public, доступен из любого места. Все, что объявлено private, доступно только внутри класса и нигде больше. Если у элемента вообще не указан модификатор уровня доступа, то такой элемент будет виден из подклассов и классов того же пакета. Именно такой уровень доступа используется в языке Java по умолчанию. Если необходимо, чтобы элемент был доступен только подклассам, причем независимо от того, находятся ли они в данном пакете или нет — используйте protected.
Таблица 8.1 Таблица ограничения доступа
| private | модификатор отсутствует | protected | public |
тот же класс | да | да | да | да |
подкласс в том же пакете | нет | да | да | да |
независимый класс в том же пакете | нет | да | да | да |
подкласс в другом пакете | нёт | нет | да | да |
независимый класс в другом пакете | нет | нет | нет | да |
8.2. Интерфейсы
Интерфейсы Java созданы для поддержки динамического выбора (resolution) методов во время выполнения программы. Интерфейсы похожи на классы, но в отличие от последних у интерфейсов нет переменных представителей, а в объявлениях методов отсутствует реализация. Класс может иметь любое количество интерфейсов. Все, что нужно сделать — это реализовать в классе полный набор методов всех интерфейсов. Сигнатуры таких методов класса должны точно совпадать с сигнатурами методов реализуемого в этом классе интерфейса. Интерфейсы обладают своей собственной иерархией, не пересекающейся с классовой иерархией наследования. Это дает возможность реализовать один и тот же интерфейс в различных классах, никак не связанных по линии иерархии классового наследования. Именно в этом и проявляется главная сила интерфейсов.
8.2.1. Оператор interface
Определение интерфейса сходно с определением класса, отличие состоит в том, что в интерфейсе отсутствуют объявления данных и конструкторов. Общая форма интерфейса приведена ниже:
>interface имя {
>тип_результата имя_метода1 (список параметров);
>тип имя_finall_переменной = значение;
>}
Обратите внимание — у объявляемых в интерфейсе методов отсутствуют операторы тела. Объявление методов завершается символом «;» (точка с запятой). В интерфейсе можно объявлять и переменные, при этом они неявно объявляются переменными типа final. Это означает, что класс реализации не может изменять их значения. Кроме того, при объявлении переменных в интерфейсе их обязательно нужно инициализировать константными значениями. Ниже приведен пример определения интерфейса, содержащего единственный метод с именем callback и одним параметром типа int.
>interface Callback {
>void callback(int param); }
8.2.2. Оператор implements
Оператор implements — это дополнение к определению класса, реализующего некоторый интерфейс.
>class имякласса [extends суперкласс]
>[implements интерфейс0 [, интерфейс 1...]]
>{тело класса}
Если в классе реализуется несколько интерфейсов, то их имена разделяются запятыми. Ниже приведен пример класса, в котором реализуется определенный нами интерфейс:
>class Client implements Callback {
>void callback(int p) {
> System.out.println("callback вызван с " + p);
>}
>}
В очередном примере метод callback интерфейса, определенного ранее, вызывается через переменную-ссылку на интерфейс:
>class Testlface {
>public static void main(String args[])
>{
>switch(result) {
>case NO:
> System.out.println("Heт");
> break;
>case YES:
> System.out.println("Дa");
> break;
>case MAYBE:
> System.out.println("Moжeт быть");
> break;
>case LATER:
> System.out.println("Позже");
> break;
>case SOON:
> System.out.priniln("Cкopo");
> break;
>case NEVER:
> System.out.println("Никогда");
> break;
}
>}
>public static void main(String args[]) {
>Question q = new Question();
>answer(q.ask());
>answer(q.ask());
>answer(q.ask());
>answer(q.ask());
}
>}
Обратите внимание на то, что результаты при разных запусках программы отличаются, поскольку в ней используется класс генерации случайных чисел Random пакета java.util.
>Позже
>Скоро
>Нет
>Да