Методы по умолчанию в интерфейсах
Размещать реализации методов непосредственно в интерфейсах, обеспечивая множественное наследование поведения.
// 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 { ... }
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 (март 2014).
До Java 8 совместное использование поведения между несвязанными классами требовало абстрактных классов, что ограничивало одиночным наследованием. Методы по умолчанию позволяют интерфейсам предоставлять реализации методов, так что классы могут наследовать поведение от нескольких интерфейсов. Это было ключевым для развития Collections API (например, List.forEach, Map.getOrDefault) без нарушения существующих реализаций.