implements是什么? (核心概念)- 为什么需要
implements? (解决的问题) - 如何使用
implements? (语法和示例) implementsvsextends(关键区别)implements的高级用法:多接口实现
implements 是什么?
implements 是 Java 中的一个关键字,用于让一个类去实现一个或多个接口。

它表达了一种 “...能够做...” 或 “...遵循...规范” 的关系。
当一个类 implements 一个接口时,它就承诺(契约)会提供该接口中所有抽象方法的具体实现,这就好比:
- 接口 是一份“技能清单”或“行为规范”。
- 类 是一个“求职者”。
implements是求职者说:“我具备这份技能清单上要求的所有技能。”
为什么需要 implements?(解决的问题)
implements 主要解决了以下几个核心问题:
- 实现多继承行为:Java 不支持一个类直接继承多个类(为了避免“菱形问题”和复杂性),但一个类可以实现多个接口,这使得 Java 能够获得类似多继承的能力,即一个对象可以拥有多种不同的“身份”或“能力”。
- 定义规范和契约:接口定义了一套标准,而不关心具体实现是什么,这确保了所有实现该接口的类都遵循相同的“规则”,提高了代码的规范性和可预测性。
- 实现解耦:我们编程时,面向的是接口(规范),而不是具体的实现类,这使得系统各部分之间的依赖关系大大降低,代码更加灵活、易于维护和扩展,这是“面向接口编程”的核心思想。
- 多态:接口是实现多态的重要方式,我们可以将接口类型的引用指向任何实现了该接口的类的对象,从而在运行时调用不同的实现。
如何使用 implements?(语法和示例)
语法
[修饰符] class <类名> implements <接口名1>, <接口名2>, ... {
// 类体
// 必须提供接口中所有抽象方法的具体实现
}
示例
我们来看一个经典的例子:Runnable 接口。Runnable 是一个函数式接口,它定义了一个可以被执行的任务的规范,其中包含一个抽象方法 run()。

第一步:定义接口
Runnable.java (Java 已经帮我们定义好了,这里只是模拟)
public interface Runnable {
// 抽象方法,没有方法体
void run();
}
第二步:创建类并实现接口
MyRunner.java
// 实现 Runnable 接口
public class MyRunner implements Runnable {
// 必须实现接口中的 run() 方法
@Override
public void run() {
System.out.println("我的任务正在执行中...");
// 这里可以写任何需要执行的代码
for (int i = 1; i <= 5; i++) {
System.out.println("计数: " + i);
}
}
}
第三步:使用实现类
Main.java
public class Main {
public static void main(String[] args) {
// 1. 创建实现类的对象
MyRunner runner = new MyRunner();
// 2. 创建一个线程,并将 MyRunner 对象作为任务传递
// 注意:这里我们用的是接口类型 Runnable,而不是具体的类 MyRunner
Thread thread = new Thread(runner);
// 3. 启动线程,线程会自动调用 runner 对象的 run() 方法
System.out.println("主线程:准备启动新线程...");
thread.start();
System.out.println("主线程:新线程已启动,主线程继续执行自己的任务。");
}
}
输出结果:
主线程:准备启动新线程...
主线程:新线程已启动,主线程继续执行自己的任务。
我的任务正在执行中...
计数: 1
计数: 2
计数: 3
计数: 4
计数: 5
关键点:
MyRunner类必须提供run()方法的具体实现。@Override注解是一个好习惯,它告诉编译器我们正在重写父类或接口中的方法,如果方法名或签名写错了,编译器会报错,能提前发现很多问题。- 在
new Thread(runner)中,我们传入的是MyRunner的实例,但Thread的构造函数期望的是一个Runnable类型的参数,这就是多态的体现:MyRunner是Runnable的一种。
implements vs extends (关键区别)
这是初学者最容易混淆的地方,一张表格可以清晰地展示它们的区别:
| 特性 | extends (继承) |
implements (实现) |
|---|---|---|
| 关系 | "是一个" (is-a) | "能够做" (can-do) |
| 对象 | 类与类之间 | 类与接口之间 |
| 目的 | 代码复用,获取父类的属性和方法,并在此基础上进行扩展。 | 定义规范,让类具备接口所定义的能力或行为。 |
| 构造 | 一个子类只能extends一个父类 (单继承)。 | 一个类可以implements多个接口 (多实现)。 |
| 示例 | Dog extends Animal (狗是一种动物) |
Dog implements Pet, Runnable (狗是宠物,并且能跑) |
简单记忆:
- 用
extends是为了“得到”已有的功能。 - 用
implements是为了“承诺”要完成某项任务。
implements 的高级用法:多接口实现
一个类可以实现多个接口,这是 Java 实现多行为组合的关键。
示例
假设我们有两个接口:Flyable (可飞行的) 和 Swimmable (可游泳的)。
// 接口1:飞行能力
interface Flyable {
void fly();
}
// 接口2:游泳能力
interface Swimmable {
void swim();
}
// 类:鸭子
// 鸭子既能飞,又能游泳
class Duck implements Flyable, Swimmable {
@Override
public void fly() {
System.out.println("鸭子拍打着翅膀飞翔。");
}
@Override
public void swim() {
System.out.println("鸭子漂浮在水面上游泳。");
}
}
// 测试
public class Main {
public static void main(String[] args) {
Duck duck = new Duck();
duck.fly(); // 调用 Flyable 接口的方法
duck.swim(); // 调用 Swimmable 接口的方法
}
}
输出:
鸭子拍打着翅膀飞翔。
鸭子漂浮在水面上游泳。
通过这种方式,Duck 类就同时具备了 Flyable 和 Swimmable 两种能力,而 Java 的单继承限制 (class Duck extends Animal) 并没有被打破。
implements是 Java 中用于让类实现接口的关键字。- 它建立了一种 “...能够做...” 的契约关系。
- 核心目的:让类遵循接口的规范,实现多态行为,并绕过 Java 的单继承限制。
- 核心规则:实现类必须提供接口中所有抽象方法的具体实现(除非该类是抽象类)。
- 与
extends的区别:extends是“继承”,侧重于代码复用和“是一个”的关系;implements是“实现”,侧重于行为规范和“能够做”的关系。 - 强大之处:一个类可以实现多个接口,这使得 Java 的设计非常灵活和强大。
理解 implements 是掌握 Java 面向对象编程和高级特性(如回调、框架设计)的基石。
