Java 接口
接口(interface)是 Java 中"约定能力"的类型:只声明方法(做什么),不关心实现(怎么做)。任何类只要 implements 一个接口,就承诺具备该能力。接口是实现多态与解耦的最强工具,JDBC、集合框架、Servlet 都在"面向接口编程"。
定义与特性
接口用 interface 关键字定义,方法默认是 public abstract,字段默认是 public static final(常量):
interface USB {
String NAME = "USB设备"; // 默认 public static final 常量
void connect(); // 默认 public abstract 方法
}
接口不能实例化,也没有构造方法;除了 JDK8 起的默认方法,接口方法都没有方法体。
实现接口:implements 与多实现
类用 implements 实现接口,必须实现全部抽象方法。一个类能实现多个接口,弥补了 Java 单继承的限制:
interface Usb { void charge(); }
interface Wifi { void connect(); }
class Phone implements Usb, Wifi { // 一个类实现多个接口
@Override public void charge() { System.out.println("USB 充电中"); }
@Override public void connect() { System.out.println("连接 Wi-Fi"); }
}
片段需放进 main 方法中运行:
Usb u = new Phone(); // 接口引用指向实现类对象
u.charge();
Phone p = new Phone();
p.connect();
// 输出:USB 充电中
// 输出:连接 Wi-Fi
JDK8 默认方法与静态方法
JDK8 起,接口可以用 default 写"带实现"的方法,实现类可不重写直接用;static 方法则用接口名直接调用:
interface Remote {
void on(); // 抽象方法
default void off() { // 默认方法:有方法体
System.out.println("已关闭");
}
static String tip() { // 静态方法
return "长按电源键开机";
}
}
给老接口加新方法时,default 让已有实现类不修改也能编译通过;必要时实现类再重写覆盖默认行为。
接口与抽象类区别表
| 对比 | 抽象类 | 接口 |
|---|---|---|
| 关键字 | abstract class | interface |
| 继承方式 | extends(单继承) | implements(可多实现) |
| 构造方法 | 可以有 | 不能有 |
| 成员变量 | 任意 | 只能是常量 |
| 具体方法 | 可以随意写 | 只能 default/static |
| 设计语义 | is-a,代码复用 | can-do,能力契约 |
经验法则:需要公共字段和代码复用用抽象类;需要"具备某能力、多实现、跨继承树"用接口。
接口可以继承接口
接口用 extends 继承另一个接口,且可多继承,得到的是方法的"并集约定":
interface Charger {
void charge();
}
interface FastCharger extends Charger { // 接口继承接口
void fastCharge();
}
实现 FastCharger 的类,必须同时实现 charge() 和 fastCharge() 两个方法。
接口回调思想
把接口对象作为参数传给方法,方法在合适的时机调用它,这就是"回调":调用方定好行为,执行方负责触发。典型如给按钮注册点击监听:
interface OnClick { void click(); }
void bind(OnClick l) { // 形参是接口
l.click(); // 时机到了就回调
}
// —— 片段需放进 main 方法中运行 ——
bind(new OnClick() { // 匿名内部类实现接口
@Override public void click() { System.out.println("按钮被点击"); }
});
// 输出:按钮被点击
接口是"能力的契约":interface 声明方法、implements 多实现、default 平滑升级、extends 组合约定。让上层依赖接口而非具体类,系统就更容易扩展、测试与替换。