跳转到主要内容
模块 4 · 第 1 课(共 2)课程中的7/14~15 min
模块课程(1/2)

接口

虽然抽象类可以包含部分实现的代码和实例字段,但 Java 中的接口是纯粹行为的契约。接口定义了类必须能够做什么,但没有定义它如何做。

这允许操作的定义与其实际实现之间完全解耦。

定义接口 (interface)

我们使用 interface 关键字。接口中声明的所有方法都隐式 public 和 abstract (无需指定):

Java
interface Drivable {
    void startEngine();
    void stopEngine();
}

实现接口 (implements)

类使用 implements 关键字实现接口,并且需要为所有定义的方法提供实现(带有主体):

Java
class Motorcycle implements Drivable {
    @Override
    public void startEngine() {
        System.out.println("Rombo del motore acceso!");
    }

    @Override
    public void stopEngine() {
        System.out.println("Motore spento.");
    }
}

接口的优点

  1. 多重继承:在Java中,一个类只能扩展一个_父类(单继承),但它可以同时实现多个接口。
    Java
    class HybridCar implements Drivable, Chargeable { ... }
  2. 解耦:可以使用接口类型来定义变量。任何实现该接口的对象都可以分配给这样的变量。
    Java
    Drivable vehicle = new Motorcycle();
    vehicle.startEngine();

接口中的常量

在接口中,可以声明字段。即使您没有指定这些修饰符,这些字段也隐式 public static final (意味着类常量)。因此,它们必须在声明后立即初始化:

Java
interface PhysicsConstants {
    double GRAVITY = 9.81; // Implicitly public static final
}

默认方法 (default)

从 Java 8 开始,可以使用 default 关键字在接口内定义具有默认实现的方法。这些方法不会强制实现类覆盖它们,而是提供后备行为:

Java
interface Logger {
    void log(String message);

    // Default method with a body
    default void logError(String message) {
        log("ERROR: " + message);
    }
}

自己尝试一下

锻炼#java.m4.l1.e1
尝试:0加载中...

使用 void Fly() 方法创建 Flyable 接口。然后实现一个 Bird 类,该类实现 Flyable 并将 Flying 打印到屏幕上。

正在加载编辑器...
显示提示

在 Flyable 中,编写 `void Fly();`。在 Bird 类中,实现用 `@Override public void Fly() { System.out.println('Flying'); 标记它的方法。 }`。

3 次尝试后可用的解决方案

锻炼#java.m4.l1.e2
尝试:0加载中...

使用 void draw() 方法定义 Drawable 接口。然后实现一个 Rectangle 类,该类实现了 Drawable 并打印 Drawing Rectangle。

正在加载编辑器...
显示提示

在接口中定义`void draw();`。在矩形中,使用`@Override public void draw() { System.out.println('绘制矩形'); }`。

3 次尝试后可用的解决方案

锻炼#java.m4.l1.e3
尝试:0加载中...

通过定义 void Swim() 方法来完成 Swimable 接口。然后,完成Duck类,使其实现Flyable和Swimmable,在fly()方法中打印Flying,在swim()方法中打印Swimming。

正在加载编辑器...
显示提示

在 Swimmable 内声明 `void Swim();`。声明“Duck 类实现 Flyable、Swimmable”并实现打印请求字符串的两种方法。

3 次尝试后可用的解决方案