97 lines
3.4 KiB
Markdown
97 lines
3.4 KiB
Markdown
- Интерфейс - тип данных
|
|
- Описывает только поведение без реализации
|
|
- Контракт интерфейса определяет, что делает класс, но не определяет как он это делает
|
|
- У класса может быть единственный класс-предок
|
|
- Класс может реализовывать много интерфейсов
|
|
## Принципы интерфейсов
|
|
- Отсутствие состояния
|
|
- Нет конструкторов
|
|
- Множественная реализация
|
|
- Полная абстракция поведения
|
|
## Определение интерфейсов
|
|
- Ключевое слово `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("Метод вложенного интерфейса");
|
|
}
|
|
}
|
|
```
|
|
Дополнительно: [[Абстрактные классы]], |