杰瑞科技汇

java的implements

  1. implements 是什么? (核心概念)
  2. 为什么需要 implements (解决的问题)
  3. 如何使用 implements (语法和示例)
  4. implements vs extends (关键区别)
  5. implements 的高级用法:多接口实现

implements 是什么?

implements 是 Java 中的一个关键字,用于让一个实现一个或多个接口

java的implements-图1
(图片来源网络,侵删)

它表达了一种 “...能够做...”“...遵循...规范” 的关系。

当一个类 implements 一个接口时,它就承诺(契约)会提供该接口中所有抽象方法的具体实现,这就好比:

  • 接口 是一份“技能清单”或“行为规范”。
  • 是一个“求职者”。
  • implements 是求职者说:“我具备这份技能清单上要求的所有技能。

为什么需要 implements?(解决的问题)

implements 主要解决了以下几个核心问题:

  • 实现多继承行为:Java 不支持一个类直接继承多个类(为了避免“菱形问题”和复杂性),但一个类可以实现多个接口,这使得 Java 能够获得类似多继承的能力,即一个对象可以拥有多种不同的“身份”或“能力”。
  • 定义规范和契约:接口定义了一套标准,而不关心具体实现是什么,这确保了所有实现该接口的类都遵循相同的“规则”,提高了代码的规范性和可预测性。
  • 实现解耦:我们编程时,面向的是接口(规范),而不是具体的实现类,这使得系统各部分之间的依赖关系大大降低,代码更加灵活、易于维护和扩展,这是“面向接口编程”的核心思想。
  • 多态:接口是实现多态的重要方式,我们可以将接口类型的引用指向任何实现了该接口的类的对象,从而在运行时调用不同的实现。

如何使用 implements?(语法和示例)

语法

[修饰符] class <类名> implements <接口名1>, <接口名2>, ... {
    // 类体
    // 必须提供接口中所有抽象方法的具体实现
}

示例

我们来看一个经典的例子:Runnable 接口。Runnable 是一个函数式接口,它定义了一个可以被执行的任务的规范,其中包含一个抽象方法 run()

java的implements-图2
(图片来源网络,侵删)

第一步:定义接口

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 类型的参数,这就是多态的体现:MyRunnerRunnable 的一种。

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 类就同时具备了 FlyableSwimmable 两种能力,而 Java 的单继承限制 (class Duck extends Animal) 并没有被打破。


  • implements 是 Java 中用于让类实现接口的关键字。
  • 它建立了一种 “...能够做...” 的契约关系。
  • 核心目的:让类遵循接口的规范,实现多态行为,并绕过 Java 的单继承限制。
  • 核心规则:实现类必须提供接口中所有抽象方法的具体实现(除非该类是抽象类)。
  • extends 的区别extends 是“继承”,侧重于代码复用和“是一个”的关系;implements 是“实现”,侧重于行为规范和“能够做”的关系。
  • 强大之处:一个类可以实现多个接口,这使得 Java 的设计非常灵活和强大。

理解 implements 是掌握 Java 面向对象编程和高级特性(如回调、框架设计)的基石。

分享:
扫描分享到社交APP
上一篇
下一篇