代码对比
✕ 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 支持
接口默认方法
可用
自 JDK 8 起可用(2014 年 3 月)。
工作原理
Java 8 之前,跨不相关类共享行为需要抽象基类,这限制了灵活性。默认方法允许接口在不破坏现有实现的情况下进行演进。
相关文档