<< Предыдущая Оглавление Следующая >>


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.

Позже
Скоро
Нет
Да

 



<< Предыдущая Оглавление Следующая >>