# 接口默认方法与私有方法机制(Java 8+)
作者:Ethan.Yang
博客:https://blog.ethanyang.cn (opens new window)
Java 8 引入了 接口默认方法(default),解决了接口扩展时的兼容性问题; Java 9 又进一步提供了 接口私有方法(private),用于在接口中复用逻辑代码。 本文将系统介绍接口中的 默认方法、私有方法与静态方法 机制。
# 一、接口中默认方法(default)
定义:
Java 8 开始允许在接口中使用 default 关键字提供方法的默认实现,使接口可以在不破坏已有实现的前提下扩展功能。
示例:
interface InterfaceA {
default void hello() {
System.out.println("Hello from InterfaceA");
}
}
interface InterfaceB {
default void hello() {
System.out.println("Hello from InterfaceB");
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 二、默认方法与继承冲突解析
多接口冲突: 若一个类实现多个接口,且多个接口定义了相同的默认方法签名,必须显式覆盖该方法并指明使用哪个接口的方法。
示例:
class MyClass implements InterfaceA, InterfaceB {
@Override
public void hello() {
InterfaceA.super.hello(); // 选择调用 InterfaceA 的默认实现
}
}
1
2
3
4
5
6
2
3
4
5
6
父类与接口冲突: 如果父类中定义了与接口默认方法同名同参数的方法,父类的方法优先级更高,会覆盖接口中的默认方法。
示例:
class Parent {
public void hello() {
System.out.println("Hello from Parent");
}
}
class Child extends Parent implements InterfaceA {
// 不需要重写 hello(),会继承 Parent 的实现
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
🔑 规则总结:
- 类中优先级 > 接口默认方法
- 多接口冲突需显示覆盖并指定调用路径
# 三、接口中的私有方法(Java 9+)
目的:
为避免默认方法中出现重复代码,可以在接口内部通过 private 定义可复用的私有辅助方法。
示例:
interface Loggable {
default void logInfo(String msg) {
log(msg, "INFO");
}
default void logWarn(String msg) {
log(msg, "WARN");
}
private void log(String msg, String level) {
System.out.println("[" + level + "]: " + msg);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
限制:
- 只能在接口内的
default或static方法中调用 - 无法被实现类访问或重写
# 四、接口中的静态方法(Java 8+)
接口还可以定义 static 方法,用于工具类方法封装,只能通过接口名调用,不能被实现类继承。
interface Util {
static String format(String s) {
return "[" + s + "]";
}
}
1
2
3
4
5
2
3
4
5
← 泛型擦除与通配符的边界 反射机制 →