模块课程(1/2)
接口
虽然抽象类可以包含部分实现的代码和实例字段,但 Java 中的接口是纯粹行为的契约。接口定义了类必须能够做什么,但没有定义它如何做。
这允许操作的定义与其实际实现之间完全解耦。
定义接口 (interface)
我们使用 interface 关键字。接口中声明的所有方法都隐式 public 和 abstract (无需指定):
interface Drivable {
void startEngine();
void stopEngine();
}实现接口 (implements)
类使用 implements 关键字实现接口,并且需要为所有定义的方法提供实现(带有主体):
class Motorcycle implements Drivable {
@Override
public void startEngine() {
System.out.println("Rombo del motore acceso!");
}
@Override
public void stopEngine() {
System.out.println("Motore spento.");
}
}接口的优点
- 多重继承:在Java中,一个类只能扩展一个_父类(单继承),但它可以同时实现多个接口。
Java
class HybridCar implements Drivable, Chargeable { ... } - 解耦:可以使用接口类型来定义变量。任何实现该接口的对象都可以分配给这样的变量。
Java
Drivable vehicle = new Motorcycle(); vehicle.startEngine();
接口中的常量
在接口中,可以声明字段。即使您没有指定这些修饰符,这些字段也隐式 public static final (意味着类常量)。因此,它们必须在声明后立即初始化:
interface PhysicsConstants {
double GRAVITY = 9.81; // Implicitly public static final
}默认方法 (default)
从 Java 8 开始,可以使用 default 关键字在接口内定义具有默认实现的方法。这些方法不会强制实现类覆盖它们,而是提供后备行为:
interface Logger {
void log(String message);
// Default method with a body
default void logError(String message) {
log("ERROR: " + message);
}
}自己尝试一下
使用 void Fly() 方法创建 Flyable 接口。然后实现一个 Bird 类,该类实现 Flyable 并将 Flying 打印到屏幕上。
显示提示
在 Flyable 中,编写 `void Fly();`。在 Bird 类中,实现用 `@Override public void Fly() { System.out.println('Flying'); 标记它的方法。 }`。
3 次尝试后可用的解决方案
使用 void draw() 方法定义 Drawable 接口。然后实现一个 Rectangle 类,该类实现了 Drawable 并打印 Drawing Rectangle。
显示提示
在接口中定义`void draw();`。在矩形中,使用`@Override public void draw() { System.out.println('绘制矩形'); }`。
3 次尝试后可用的解决方案
通过定义 void Swim() 方法来完成 Swimable 接口。然后,完成Duck类,使其实现Flyable和Swimmable,在fly()方法中打印Flying,在swim()方法中打印Swimming。
显示提示
在 Swimmable 内声明 `void Swim();`。声明“Duck 类实现 Flyable、Swimmable”并实现打印请求字符串的两种方法。
3 次尝试后可用的解决方案