第七章:Java 8新特性
7.4 默认方法与静态方法
1. 默认方法(Default Methods)
1.1 默认方法的定义
默认方法是Java 8引入的一种新特性,允许在接口中提供具体的方法实现。通过使用default关键字修饰,接口可以包含具有默认实现的方法,而实现该接口的类可以选择是否重写这些方法。
public interface Vehicle {
// 默认方法
default void start() {
System.out.println("Vehicle started");
}
}
1.2 默认方法的作用
- 向后兼容性:允许在接口中添加新方法而不破坏现有的实现类。
- 减少重复代码:多个实现类可以共享默认方法的实现,避免代码冗余。
- 支持函数式编程:为Java的集合框架(如
List、Set)添加了新的功能(如forEach、stream)。
1.3 默认方法的使用场景
- 当接口需要扩展功能,但不想强制所有实现类修改代码时。
- 为接口提供通用的默认行为,例如日志记录或简单的工具方法。
1.4 默认方法的冲突解决
如果一个类实现了多个接口,且这些接口中有相同签名的默认方法,编译器会要求类明确指定使用哪个默认方法(或重写方法):
public class Car implements Vehicle, ElectricVehicle {
@Override
public void start() {
Vehicle.super.start(); // 显式调用Vehicle的默认方法
}
}
2. 静态方法(Static Methods)
2.1 静态方法的定义
Java 8允许在接口中定义静态方法,这些方法通过接口名直接调用,不能被实现类继承或重写。
public interface MathUtils {
static int add(int a, int b) {
return a + b;
}
}
// 调用方式
int result = MathUtils.add(2, 3);
2.2 静态方法的作用
- 工具方法:提供与接口相关的工具功能(如
Collections.sort())。 - 工厂方法:替代传统的工厂类,例如
Stream.of()。 - 代码组织:将与接口逻辑紧密相关的方法集中到接口中。
2.3 静态方法与默认方法的区别
| 特性 | 默认方法 | 静态方法 |
|---|---|---|
| 调用方式 | 通过实现类实例调用 | 通过接口名直接调用 |
| 是否可重写 | 可以重写 | 不能重写 |
| 主要用途 | 提供默认实现 | 提供工具方法 |
3. 实际应用示例
3.1 默认方法示例:集合框架的forEach
List<String> list = Arrays.asList("A", "B", "C");
list.forEach(System.out::println); // 使用Iterable接口的默认方法forEach
3.2 静态方法示例:Comparator接口的工厂方法
List<String> names = Arrays.asList("Alice", "Bob");
names.sort(Comparator.naturalOrder()); // 调用Comparator的静态方法naturalOrder
4. 总结
- 默认方法:增强了接口的灵活性,支持接口的演进,同时减少代码重复。
- 静态方法:将工具方法与接口绑定,提高代码的内聚性。
- 适用场景:默认方法适合扩展接口功能,静态方法适合提供通用工具逻辑。
注意:默认方法和静态方法使得接口逐渐接近抽象类的能力,但接口仍然不能包含实例字段(状态)。
