IT-Storm

Программное обеспечение не закончено до тех пор, пока не умер последний пользователь

Menu

Интерфейсы

Интерфейсы

Интерфейс определяет набор методов, которые должны присутствовать в классе. В самом интерфейсе эти методы не реализуются, поэтому он представляет собой чисто логическую конструкцию. Пакеты и интерфейсы предоставляют дополнительную возможность для более рациональной организации программ и контроля их структуры.

Как только интерфейс будет определен, он может быть реализован в любом количестве классов. Кроме того, в одном классе может быть реализовано любое количество интерфейсов.


Интерфейсы объявляются с помощью ключевого слова interface. Ниже приведена упрощенная форма объявления интерфейса.
доступ interface имя {
     возвращаемый_тип имя метода_1 (список_параметров) ;
     возвращаемый_тип имя_ метода_2 (список_параметров) ;
     тип переменная_1 = значение;
     тип переменная_2 = значение;
     / / . . .
     возвращаемый_тип имя_метода_N(список_параметров);
     тип переменная_N = значение;
}
Переменные, объявленные в интерфейсе, не являются переменными экземпляра. Они неявно обозначаются ключевыми словами public, final и static и обязательно подлежат инициализации. По сути, они являются константами.

Реализация интерфейсов
Ниже приведена общая форма реализации интерфейса в классе.
class имя класса extends суперкласс implements интерфейс {
	// тело класса
}

Реализуемые методы должны быть объявлены открытыми (public). Это нужно сделать непременно, поскольку любой метод интерфейса - неявно считается открытым для доступа!
Следует также иметь в виду, что если в определении класса имеется ключевое слово implements, но он не реализует все методы указанного интерфейса, то этот класс должен быть объявлен абстрактным (abstract).


Применение интерфейсных ссылок
Возможно, вы будете несколько удивлены, узнав, что в Java допускается объявлять переменные ссылочного интерфейсного типа, т.е. переменные, хранящие ссылки на интерфейс. Такая переменная может ссылаться на любой объект, реализующий ее тип интерфейса. При вызове метода для объекта по интерфейсной ссылке выполняется вариант этого метода, реализованный в классе данного объекта. Этот процесс аналогичен применению ссылки на суперкласс для доступа к объекту подкласса.

Переменные в интерфейсах
Для того чтобы определить набор общедоступных констант, достаточно создать интерфейс, в котором объявлялись бы не методы, а только нужные константы.

Каждый класс, которому требуются эти константы, должен просто "реализовать" интерфейс, чтобы сделать константы доступными.


Наследование интерфейсов
Один интерфейс может наследовать другой, для чего служит ключевое слово extends. Синтаксис наследования интерфейсов ничем не отличается от того, который используется для наследования классов. Если класс реализует один интерфейс, наследующий другой интерфейс, в нем следует определить все методы, объявленные в интерфейсах по всей цепочке наследования.

Методы интерфейсов, используемые по умолчанию
Выпуск JDK 8 расширил функциональность интерфейсов, добавив возможность определения в них методов, используемых по умолчанию. Благодаря этому интерфейс теперь может включать реализации методов, которые будут использоваться по умолчанию, если другие реализации не предоставляются.

Важно подчеркнуть, что введение методов по умолчанию никоим образом не влияет на одно из фундаментальных свойств интерфейсов - интерфейсу по-прежнему запрещено иметь переменные экземпляра.

Таким образом, ключевое различие между интерфейсом и классом состоит в том, что класс может поддерживать информацию о состоянии, а интерфейс - не может.
// Объявление метода по умолчанию, включающее его реализацию
default int getAdminID() {
	return 1;
}

Если же один интерфейс наследует другой, причем оба они определяют метод по умолчанию с одним и тем же именем, то приоритет имеет версия метода, определенная в наследующем интерфейсе.

На заданную по умолчанию реализацию можно ссылаться явно, используя ключевое слово super.
Общая форма подобного обращения приведена ниже. имя_интерфейса.suреr.имя_метода()

Использование статических методов интерфейса
В JDK 8 была добавлена еще одна новая возможность, а именно: теперь интерфейс может определять один или несколько статических методов. Как и статические методы класса, статические методы, определенные в интерфейсе, можно вызывать без привлечения объектов.
Таким образом, чтобы вызвать статический метод, ни реализация интерфейса, ни создание его экземпляра не требуются.

имя_интерфейса.имя_статического_метода();

Следует также отметить, что статические методы интерфейса не наследуются ни реализующим его классом, ни производными интерфейсами.

Java