Language Средний

Размещать реализации методов непосредственно в интерфейсах, обеспечивая множественное наследование поведения.

✕ Java 7
// Need abstract class to share behavior
public abstract class AbstractLogger {
    public void log(String msg) {
        System.out.println(
            timestamp() + ": " + msg);
    }
    abstract String timestamp();
}

// Single inheritance only
public class FileLogger
    extends AbstractLogger { ... }
✓ Java 8+
public interface Logger {
    default void log(String msg) {
        IO.println(
            timestamp() + ": " + msg);
    }
    String timestamp();
}

// Multiple interfaces allowed
public class FileLogger
    implements Logger, Closeable { ... }
Заметили проблему в этом коде? Сообщите нам.
🔀

Множественное наследование

Классы могут реализовывать множество интерфейсов с методами по умолчанию — в отличие от единственного абстрактного класса.

📦

Эволюция API

Добавлять новые методы в интерфейсы без нарушения существующих реализаций.

🧩

Компонуемое поведение

Свободно комбинировать возможности из нескольких интерфейсов.

Старый подход
Абстрактные классы для общего поведения
Современный подход
Методы по умолчанию в интерфейсах
Начиная с JDK
8
Сложность
Средний
Методы по умолчанию в интерфейсах
Доступно

Доступно с JDK 8 (март 2014).

До Java 8 совместное использование поведения между несвязанными классами требовало абстрактных классов, что ограничивало одиночным наследованием. Методы по умолчанию позволяют интерфейсам предоставлять реализации методов, так что классы могут наследовать поведение от нескольких интерфейсов. Это было ключевым для развития Collections API (например, List.forEach, Map.getOrDefault) без нарушения существующих реализаций.