上一篇
在Java中添加接口,需使用
interface关键字定义接口(声明抽象方法),再通过
implements关键字在类中实现接口方法,接口支持多继承,强制实现类遵守契约,增强代码规范性与扩展性。
接口的核心作用
- 定义规范:约定类必须实现的方法(契约式编程)。
- 实现多继承:类可同时实现多个接口。
- 解耦代码:分离声明与实现,提升扩展性。
添加接口的步骤
声明接口
使用 interface 关键字定义接口,包含抽象方法(隐式 public abstract):
// 定义接口
public interface Vehicle {
void start(); // 抽象方法(无方法体)
void stop();
// Java 8+ 支持默认方法
default void honk() {
System.out.println("Beep beep!");
}
// Java 8+ 支持静态方法
static int getMaxSpeed() {
return 200;
}
}
实现接口
类通过 implements 关键字实现接口,必须重写所有抽象方法:
public class Car implements Vehicle {
@Override
public void start() {
System.out.println("Car engine started");
}
@Override
public void stop() {
System.out.println("Car engine stopped");
}
}
多接口实现
一个类可实现多个接口(用逗号分隔):
public class Drone implements Vehicle, Camera {
@Override
public void start() { /* 实现Vehicle的方法 */ }
@Override
public void stop() { /* 实现Vehicle的方法 */ }
@Override
public void takePhoto() { /* 实现Camera的方法 */ }
}
接口继承
接口可继承其他接口(支持多继承):

public interface ElectricVehicle extends Vehicle, Chargable {
void batteryCapacity();
}
接口特性详解
-
默认方法(Java 8+)
- 用
default修饰,提供默认实现。 - 实现类可直接使用或重写。
interface Speaker { default void playSound() { System.out.println("Playing default sound"); } }
- 用
-
静态方法(Java 8+)
- 通过接口名直接调用,不依赖实例。
Vehicle.getMaxSpeed(); // 调用静态方法
- 通过接口名直接调用,不依赖实例。
-
常量字段

- 接口中声明的变量默认为
public static final。interface Constants { double PI = 3.14; // 等同于 public static final double PI }
- 接口中声明的变量默认为
接口 vs 抽象类
| 特性 | 接口 | 抽象类 |
|---|---|---|
| 方法实现 | 支持默认方法(Java 8+) | 支持抽象/具体方法 |
| 多继承 | 类可实现多个接口 | 类只能继承一个抽象类 |
| 构造函数 | 不允许 | 允许 |
| 状态(字段) | 只允许常量 | 可包含实例变量 |
| 适用场景 | 定义行为契约 | 复用代码或共享状态 |
最佳实践
-
面向接口编程
// 声明接口类型变量 Vehicle myVehicle = new Car(); myVehicle.start(); // 运行时绑定到Car的实现
-
接口隔离原则
拆分臃肿接口为多个小接口,避免强制实现无关方法。 -
优先使用默认方法
在接口升级时添加默认方法,避免破坏现有实现类。
完整示例
// 定义接口
interface Logger {
void log(String message);
default void logError(String error) {
log("[ERROR] " + error);
}
}
// 实现接口
class FileLogger implements Logger {
@Override
public void log(String message) {
System.out.println("Writing to file: " + message);
}
}
// 使用接口
public class Main {
public static void main(String[] args) {
Logger logger = new FileLogger();
logger.log("System started"); // 输出: Writing to file: System started
logger.logError("Disk full"); // 输出: Writing to file: [ERROR] Disk full
}
}
常见问题
Q1: 接口能包含构造方法吗?
不能,接口没有构造方法,无法实例化。

Q2: 接口方法可以是 private 吗?
- Java 9+ 支持
private方法(用于拆分默认方法逻辑)。 - 抽象方法必须是
public(可省略修饰符)。
Q3: 何时用接口?何时用抽象类?
- 需要多继承或定义行为规范 → 接口。
- 需要共享代码或维护状态 → 抽象类。
