1.什么是默认方法?
-
定义:Java 8 引入的接口特性,允许在接口中定义 有具体实现的方法(用
default
关键字修饰)。 -
核心目的:在不破坏现有实现类的情况下,扩展接口的功能。
-
背景:Java 集合框架需要添加新方法(如
forEach
、stream
),但直接修改接口会导致所有实现类必须重写新方法,默认方法解决了这一问题。
2.默认方法的语法
public interface MyInterface {
// 抽象方法(无实现)
void abstractMethod();
// 默认方法(有实现)
default void defaultMethod() {
System.out.println("这是默认方法的实现");
}
}
3. 默认方法的特点
-
实现类无需重写:实现类可以直接继承默认方法的实现,也可以选择覆盖。
-
接口多重继承:如果一个类实现了多个接口,且这些接口有 相同签名的默认方法,必须通过重写解决冲突。
-
调用父接口默认方法:通过
接口名.super.默认方法名()
显式调用。
4. 默认方法的应用场景
-
向后兼容:为旧接口添加新方法而不影响已有实现。
-
提供通用功能:如Iterable<T>接口的
forEach
方法,继承来该接口的子接口以及子类都能用:
我们常见的集合List、Set、Queue、Deque接口等都是继承了该接口的,都能在具体实例化接口之后,直接使用foreach等在Iterator接口中通过default实现的默认方法。
5. 默认方法冲突解决
-
规则:如果一个类实现了多个接口,且这些接口有相同的默认方法,必须重写该方法。
interface A {
default void foo() {
System.out.println("A.foo");
}
}
interface B {
default void foo() {
System.out.println("B.foo");
}
}
class C implements A, B {
// 必须重写 foo()
@Override
public void foo() {
A.super.foo(); // 显式调用 A 的默认方法
}
}
6.参考
......