Интерфейсы в Java: определение, использование и лучшие практики
Интерфейс — ссылочный тип, похожий на класс. Содержит абстрактные методы. Класс реализует интерфейс (implements), тем самым наследуя его абстрактные методы.
Особенности интерфейсов
- Могут содержать: абстрактные методы, константы (static final), default-методы, static-методы, вложенные типы.
- Тела методов только у default и static (начиная с Java 8).
- Нельзя инстанцировать, нет конструкторов.
- Все методы неявно
public abstract(до Java 8). - Поля только
static final. - Класс реализует интерфейс, не расширяет его.
- Интерфейс может расширять несколько интерфейсов (
extends).
Объявление интерфейса
public interface NameOfInterface {
// константы
// абстрактные методы
}
abstract и public для методов не обязательны (неявны).
Пример
interface Animal {
void eat();
void travel();
}
Реализация интерфейса
Класс-«контракт» обязан реализовать все методы (если не abstract).
public class MammalInt implements Animal {
public void eat() { System.out.println("Mammal eats"); }
public void travel() { System.out.println("Mammal travels"); }
public int noOfLegs() { return 0; }
public static void main(String args[]) {
MammalInt m = new MammalInt();
m.eat(); m.travel();
}
}
Результат: Mammal eats Mammal travels
Правила переопределения методов интерфейса
- Проверяемые исключения — только те, что в интерфейсе или их подтипы.
- Сигнатура и возвращаемый тип (или подтип) должны совпадать.
- Класс-реализация может быть abstract — тогда методы не обязательны.
Расширение интерфейсов
Интерфейс может расширять другой интерфейс (extends). Дочерний наследует методы родителя.
interface Sports { void setHomeTeam(String name); void setVisitingTeam(String name); }
interface Football extends Sports { void homeTeamScored(int points); ... }
interface Hockey extends Sports { void homeGoalScored(); ... }
Класс, реализующий Hockey, должен реализовать все 6 методов (4 своих + 2 из Sports).
Множественное расширение интерфейсов
Интерфейс может расширять несколько интерфейсов через запятую:
public interface Hockey extends Sports, Event { ... }
Маркерные интерфейсы (Tagging Interfaces)
Интерфейсы без методов. Две цели:
- Общий родитель: например,
EventListener— маркер для слушателей событий. - Добавление типа: класс, реализующий маркерный интерфейс, становится этим типом через полиморфизм, не реализуя методы.
package java.util;
public interface EventListener {}
java
- Ключевое слово final в Java: переменные, методы и классы
- Оператор instanceof в Java: полное руководство с примерами
- Интерфейсы в Java: концепции, реализация и лучшие практики
- Статические вложенные классы в Java: использование, отличия и примеры
- Анонимные внутренние классы в Java: определение, синтаксис и практические примеры
- Паттерн Singleton в Java: как реализовать и безопасно использовать
- Рефлексия в Java: инспекция классов, методов и полей во время выполнения
- Освоение Java ObjectOutputStream: сериализация, методы и практические примеры
- Освоение Java Generics: создание переиспользуемого, типобезопасного кода
- Мастерство файловых операций в Java с java.io: создание, чтение, запись и удаление