Интерфейсы java.
Объявление интерфейса вводит новый ссылочный тип, членами которого являются константы и абстрактные методы. Этот тип не может быть реализован в виде экземпляра объекта, но его могут реализовывать классы, обеспечивая реализацию его абстрактных методов.
Программы на Яве могут использовать интерфейсы для того, чтобы допускать для связанных классов разделение общего абстрактного суперкласса или для добавления методов в Object, от которого любой класс наследует по умолчанию.
Интерфейс может быть объявлен, для того чтобы быть прямым расширением одного или более интерфейсов, предполагая, что он неявно определяет все абстрактные методы и константы расширяющих его интерфейсов, кроме каких-нибудь констант, которые могут быть скрыты (частные – private).
Класс может непосредственно реализовать один или более интерфейсов, в том смысле, что любой экземпляр класса реализует все абстрактные методы заданные интерфейсом или интерфейсами. Класс обязательно реализует все интерфейсы, его непосредственные суперклассы и непосредственные суперинтерфейсы. Это (множественное) наследование интерфейса позволяет объектам поддерживать (множественное) некоторое общее поведение производного объекта.
Интерфейсы разрабатываются и для поддержки динамического вызова методов во время выполнения (при вызове одного метода класса из другого, необходимо, чтобы оба класса присутствовали во время компиляции для проверки совпадения сигнатур, что приводит к необходимости размещения в памяти длинных иерархических цепочек). Интерфейсы исключают определения метода из иерархии и предоставляют более эффективную возможность реализации интерфейсов.
Иногда говорят, что интерфейс – это Java вариант множественного наследования, запрещенного для классов JAVA. Интерфейсы определяют набор методов и констант, определяющих некоторый стандартный интерфейс, который реализуется классом. Интерфейсы близки к классам.
Формальное определение :
Модификатор_доступа имя _интерфейса {
тип_возвращаемого_знач имя_метода1(список_параметров);
тип_возвращаемого_знач имя_метода2(список_параметров);
тип имя_final_переменной1=значение;
тип имя_final_переменной2=значение;
//……………………………………………………….
тип_возвращаемого_знач имя_метода1N(список_параметров);
тип имя_final_переменнойN=значение;
}
Интерфейсы имеют следующие ограничения:
Модификатор_доступа - могут быть только public или не используется (тогда, по-умолчанию, интерфейс доступен только членам пакета, в котором он объявлен).
Методы - могут быть только абстрактными методами;
поля - final, static (константы, не меняющие значений, такие спецификации для них назначаются автоматически, должны быть инициализированы постоянными значениями);
сами интерфейсы - не могут иметь реализации методов.
Реализующие данный интерфейс классы отвечают за содержательную реализацию этих методов, т.е. в реализующих классах необходимо определить (реализовать) каждый метод интерфейса.
Таким образом, интерфейсы позволяют очертить определенным образом некоторые постоянные характеристики и собственно интерфейс управления будущими объектами, оставляя определение тела методов реализующим классам.
По умолчанию интерфейсы могут реализовываться всеми классами своего же пакета либо и другими классами, если интерфейс объявлен как public. Для интерфейса с модификатором public, имя файла, в котором размещается интерфейс должно соответствовать имени интерфейса с расширением .java, для других интерфейсов (не public) это соответствие является рекомендацией.
Интерфейс может расширять (наследовать) другие интерфейсы. Наследуются все методы и статические константы суперинтерфейса.
В этом случае синтаксис интерфейса объявляется следующей формулой:
модификатор interface имя_интерфейса extends список_интерфейсов.
Например:
interface A extends B {
public void f1(int a1);
}
Интерфейсы не могут расширять классы (наследовать от классов). Реализация методов (переопределение методов), объявленных в интерфейсах выполняется в классах. При этом если в классе наследуется иерархия интерфейсов, то необходимо переопределить методы как в суперинтерфейсе (базовом интерфейсе), так и в производных интерфейсах, т.е. переопределить (реализовать) все методы всех интерфейсов, в создаваемом классе. В противном случае, класс должен быть объявлен как абстрактный.
В теле интерфейса могут содержатся объявления методов (без реализации), т.е. абстрактных методов, которые задают структуру организации работы с объектом но определяются в классах, реализующих интерфейс.
Реализация методов интерфейсов в классах должна быть объявлена со специализацией public.
Поля в интерфейсах являются глобальными для класса его реализующего. Они могут быть только public, final, static, т.е. неизменямые, независмо от того, указаны ли какие либо модификаторы из public, final, static в объявлении.
Интерфейс можно использовать как метод импорта разделяемых переменных, инициализированных нужными значениями во множественные классы, реализующие этот интерфейс. Вданном случае интерфейс может содержать и только поля. Поля становятся доступными и видимыми для всех объектов всех реализующих классов. Для реализации интерфейсов необходимо наследовать интерфейс (ы) в классе и переопределить все методы, объявленные в интерфейсе, в противном случае класс будет абстрактным.
Если класс реализует два интерфейса, содержащие один и тот же метод, то пользователи любого интерфейса будут использовать один и тот же метод.
Пример:
