Интерфейсы
- Интерфейс - тип данных
- Описывает только поведение без реализации
- Контракт интерфейса определяет, что делает класс, но не определяет как он это делает
- У класса может быть единственный класс-предок
- Класс может реализовывать много интерфейсов
Принципы интерфейсов
- Отсутствие состояния
- Нет конструкторов
- Множественная реализация
- Полная абстракция поведения
Определение интерфейсов
- Ключевое слово
interface - Все методы по умолчанию
public abstract - Все поля
public static final - Реализация - ключевое слово
implements
Наследование интерфейсов
Интерфейс может расширять другие интерфейсы (несколько)
interface I extends I1, I2, I3 { }
Методы
- Абстрактные - основной контракт
- Методы с реализацией по умолчанию -
default - Статические
- Приватные
protected- запрещены, ошибка компиляции
Default методы
- Реализация вспомогательного поведения в интерфейсе
- Необязательное переопределение в классах
- Если в двух интерфейсах есть
default-методы с одинаковым именем - класс обязан их переопределить. Можно взять реализацию черезInterfaceName.super.methodName
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 методы
- Вспомогательный код
Вложенные интерфейсы
Интерфейсы, как и классы могут быть вложенными
class Printer{
interface Printable {
void print();
}
}
class Book implements Printer.Printable {
public void print() {
System.out.println("Печатаем книгу");
}
}
Printer.Printable printable = new Book();
printable.print();
Могут вкладываться и в другие интерфейсы
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("Метод вложенного интерфейса");
}
}
Дополнительно: Абстрактные классы,