实现接口
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 35 课,共 87 课。
要使用一个接口,类必须使用 implements 关键字来实现它。然后,类会为接口中声明的所有方法提供具体实现:
public interface Drawable {
void draw();
}
public class Circle implements Drawable {
private double radius;
public Circle(double radius) {
this.radius = radius;
}
@Override
public void draw() {
System.out.println("Drawing a circle with radius " + radius);
}
}如果一个类实现了接口,却没有实现接口中的所有方法,编译器就会报错。@Override 注解是可选的,但建议使用,因为它有助于发现错误。
和抽象类一样,你可以将接口用作引用类型。这样就能实现多态,让实现同一接口的不同类可以统一处理:
Drawable shape1 = new Circle(5.0);
Drawable shape2 = new Rectangle(4.0, 3.0);
shape1.draw(); // 绘制半径为 5.0 的圆
shape2.draw(); // 绘制尺寸为 4.0 x 3.0 的矩形这很强大,因为使用 Drawable 引用的代码不需要知道具体的类类型。它只关心对象是否可以绘制。
在下一课中,你将看到一个类如何同时实现多个接口。
挑战
简单让我们构建一个扬声器系统,演示类如何实现接口。你将创建一个接口,用来定义任何扬声器都能做什么,然后创建两种不同类型的扬声器,让它们以各自的方式实现这个约定。
你将把代码分布在 4 个文件中:
Speaker.java:定义一个名为Speaker的接口,声明任何扬声器都必须能够做什么。每个扬声器都应有一个speak()方法,并返回一个 String。这是所有实现该接口的类都必须遵守的约定。Human.java:创建一个实现Speaker接口的类。Human 有一个name字段(String)。添加一个构造函数来初始化名称,并实现speak()方法,使其返回:[name] says: Hello everyone!Robot.java:再创建一个实现Speaker接口的类。Robot 有一个model字段(String)。添加一个构造函数来初始化型号,并实现speak()方法,使其返回:Robot [model] says: Beep boop!Main.java:使用基于接口的多态把所有内容整合起来。你会收到两个输入:一个人的姓名和一个机器人的型号。创建一个 Human 和一个 Robot,然后将它们存入一个由Speaker引用组成的数组中。遍历数组,并打印对每个扬声器调用speak()的结果。
你会收到两个输入:人的姓名(String)和机器人的型号(String)。
输出应有两行,每个扬声器各一行。注意,虽然 Human 和 Robot 的说话方式完全不同,但通过 Speaker 接口,它们都可以用统一的方式处理!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入
String humanName = scanner.nextLine();
String robotModel = scanner.nextLine();
// TODO:用给定的名字创建一个 Human 对象
// TODO:用给定的型号创建一个 Robot 对象
// TODO:创建一个包含这两个对象的 Speaker 引用数组
// TODO:遍历数组,打印每个 Speaker 对象调用 speak() 的结果
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器