外观
【Default】接口默认实现
约 822 字大约 3 分钟
2025-10-19
Java8之前的痛点
Java8之前,所有接口实现类都必须实现接口中的每一个抽象方法。也就是说,每当需要为接口新增方法,所有实现类都必须同步修改,给代码维护带来了非常大的隐形成本。 这个痛点,在java8中得到了改变,允许接口给接口方法提供默认(default)实现,接口的所有实现类,按需实现,不需要再因为接口规范问题,强制实现接口的抽象方法。
核心语法示例
默认方法的语法十分简洁,只需在接口方法返回类型前加上default关键字,即可为该方法提供默认实现。
例如:
public interface Shape {
// 抽象方法,必须由实现类实现
double area();
// 默认方法,提供默认实现
default void displayInfo() {
System.out.println("This is a shape with area: " + area());
}
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
// 这里可以选择重写displayInfo方法,也可以直接使用接口的默认实现
}上面两个接口方法,其中area非默认实现,所有实现类必须重写,但是方法displayInfo带有关键字default,有需要可以重写,不需要就不用管。
默认接口带来的变化
- 向后兼容
简单说就是,如果接口新增抽象方法,之前实现接口的实现类,不需要全部再重写新增的抽象方法。
- 通用实现下沉
之前通用功能都只能通过一个类实现接口,然后其余实现类再继承这个类来完成通用功能抽象,但是现在不需要再通过中间的一个接口实现类来完成,可以直接在接口中定有通用代码。
public interface Shape {
double area();
default String getName() {
return getClass().getSimpleName();
}
default void draw() {
System.out.println("Drawing " + getName() + " with area: " + area());
}
}
public class Circle implements Shape {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public double area() {
return Math.PI * radius * radius;
}
}
public class Rectangle implements Shape {
private double width;
private double height;
public Rectangle(double width, double height) {
this.width = width;
this.height = height;
}
@Override
public double area() {
return width * height;
}
}如上,area和draw都是通用能力,在接口中就已经定义了接口实现代码,接口实现类可以直接使用。
- 模拟多重继承
对曰类和接口,一直是单继承,多实现,假设今天有个实现类,需要复用两个父类的通用方法,这在以前没办法做到,但是现在可以通过实现两个接口,然后通用能力在接口中实现,就可以完成。 举个例子:
public interface Flyable {
default void fly() {
System.out.println("Flying in the sky");
}
}
public interface Swimmable {
default void swim() {
System.out.println("Swimming in the water");
}
}
public class Duck implements Flyable, Swimmable {
// Duck类同时具备飞行和游泳的能力
}接口静态方法
java除了新增接口的默认方法,还新增了静态方法,可以在接口中定义静态方法实现。
public interface MathUtil {
static int add(int a, int b) {
return a + b;
}
static int multiply(int a, int b) {
return a * b;
}
}java8在接口层面的优化,核心都是降低代码理解程度和维护成本,让程序员能够写出更加优雅的代码。