Короткий ответ
Default-метод — это метод интерфейса, у которого есть реализация, помеченная ключевым словом default. Он нужен для обратной совместимости: до Java 8 методы интерфейсов были только абстрактными, и добавление нового метода ломало все классы-реализации. Теперь в существующий интерфейс можно добавить метод с готовой реализацией, и классы продолжат компилироваться без изменений, а при желании переопределят его.
Как это работает подробнее
Именно благодаря default-методам в Java 8 в старые интерфейсы стандартной библиотеки добавили новые возможности: в Collection появился метод stream(), в List — sort(). Это дало и второе преимущество — множественное «поведенческое» наследование: класс может получить готовую реализацию сразу от нескольких интерфейсов, если между ними нет конфликтов.
Важное правило: если класс реализует два интерфейса с одинаковыми default-методами, возникает конфликт, и класс обязан переопределить метод явно, например вызвав SomeInterface.super.method(). Реализация из суперкласса всегда важнее default-метода интерфейса.
- С Java 8 в интерфейсах появились и статические методы; в отличие от default-методов, они не наследуются классами-реализациями и вызываются через имя интерфейса.
- Default-метод не обязан быть переопределён, но его можно переопределить в классе-реализации как обычный метод.
Пример кода
interface Vehicle {
void start(); // абстрактный метод
default void honk() { // default-метод с реализацией
System.out.println("Бип-бип!");
}
}
class Car implements Vehicle {
@Override
public void start() {
System.out.println("Заводим мотор");
}
// honk() наследуется с реализацией по умолчанию
}
public class DefaultMethodExample {
public static void main(String[] args) {
Car car = new Car();
car.start();
car.honk(); // реализация по умолчанию
}
}