- Интерфейс - тип данных - Описывает только поведение без реализации - Контракт интерфейса определяет, что делает класс, но не определяет как он это делает - У класса может быть единственный класс-предок - Класс может реализовывать много интерфейсов ## Принципы интерфейсов - Отсутствие состояния - Нет конструкторов - Множественная реализация - Полная абстракция поведения ## Определение интерфейсов - Ключевое слово `interface` - Все методы по умолчанию `public abstract` - Все поля `public static final` - Реализация - ключевое слово `implements` ## Наследование интерфейсов Интерфейс может расширять другие интерфейсы (несколько) ```Java interface I extends I1, I2, I3 { } ``` ## Методы - Абстрактные - основной контракт - Методы с реализацией по умолчанию - `default` - Статические - Приватные - `protected` - запрещены, ошибка компиляции ## Default методы - Реализация вспомогательного поведения в интерфейсе - Необязательное переопределение в классах - Если в двух интерфейсах есть `default`-методы с одинаковым именем - класс обязан их переопределить. Можно взять реализацию через `InterfaceName.super.methodName` ```Java interface I1 { default void print() { print("Hello"); } } interface I2 { default void print() { print("Bye"); } } class A implements I1, I2 { @Override public void print() { I1.super.print(); // можно взять реализацию I2.super.print(); } } // Hello // Bye ``` ## Static методы - Принадлежат интерфейсу, а не экземплярам - Вызов через `InterfaceName.methodName` - Не наследуются - Утилитарные функции ## Private методы - Вспомогательный код ## Вложенные интерфейсы Интерфейсы, как и классы могут быть вложенными ```Java class Printer{ interface Printable { void print(); } } class Book implements Printer.Printable { public void print() { System.out.println("Печатаем книгу"); } } Printer.Printable printable = new Book(); printable.print(); ``` Могут вкладываться и в другие интерфейсы ```Java public interface OuterInterface { void outerMethod(); interface InnerInterface { void innerMethod(); } } public class MyClass implements OuterInterface, OuterInterface.InnerInterface { @Override public void outerMethod() { System.out.println("Метод внешнего интерфейса"); } @Override public void innerMethod() { System.out.println("Метод вложенного интерфейса"); } } ``` Дополнительно: [[Абстрактные классы]],