实现多个接口
本课属于 Coddy Java 学习旅程的“面向对象编程”单元。第 36 课,共 87 课。
与类继承不同,类继承只能扩展一个类,而 Java 允许一个类实现多个接口。这就是 Java 如何安全地实现某种形式的多重继承。
要实现多个接口,请在 implements 关键字后列出它们,并用逗号分隔:
public interface Drawable {
void draw();
}
public interface Resizable {
void resize(int width, int height);
}
public class Rectangle implements Drawable, Resizable {
private int width, height;
public Rectangle(int width, int height) {
this.width = width;
this.height = height;
}
@Override
public void draw() {
System.out.println("Drawing rectangle " + width + "x" + height);
}
@Override
public void resize(int width, int height) {
this.width = width;
this.height = height;
}
}这个类必须实现它声明的每个接口中的所有方法。你也可以将继承与多个接口结合使用:
public class Square extends Shape implements Drawable, Resizable {
// 必须实现两个接口中的方法
// 还可以使用从 Shape 继承的成员
}这种灵活性让你可以设计出能够承担多种角色的类。SmartPhone 可以实现 Callable、Messageable 和 Browsable 接口,每个接口都定义了手机支持的不同功能。
挑战
简单我们来构建一个智能设备系统,让设备可以具备多种功能。你将创建一个 SmartTV,它既可以开机和关机,也可以调节音量:这将展示一个类如何实现多个接口,以承担不同的角色。
你将把代码分成 4 个文件:
Powerable.java:为可以开关机的设备定义一个接口。该接口应声明两个方法:powerOn()和powerOff(),两者的返回类型都是 void。VolumeControl.java:为可以控制音量的设备定义一个接口。该接口应声明一个返回类型为 void 的方法setVolume(int level),以及一个返回类型为 int 的方法getVolume()。SmartTV.java:创建一个同时实现Powerable和VolumeControl接口的类。你的 SmartTV 应有一个brand字段(String)、一个isOn字段(boolean,初始值为 false)和一个volume字段(int,初始值为 0)。添加一个接收品牌名称的构造函数。实现所有必需的方法:powerOn()应将isOn设为 true,并打印:[brand] TV is now ONpowerOff()应将isOn设为 false,并打印:[brand] TV is now OFFsetVolume(int level)应更新音量,并打印:[brand] TV volume set to [level]getVolume()应返回当前音量
Main.java:把所有内容组合起来,演示如何实现多个接口。你会收到两个输入:品牌名称(String)和音量级别(int)。使用给定的品牌创建一个 SmartTV,然后:- 调用
powerOn() - 调用
setVolume(),并传入给定的音量级别 - 使用
getVolume()打印:Current volume: [volume] - 调用
powerOff()
- 调用
你会收到两个输入:电视品牌(String)和音量级别(int)。
你的输出应包含 4 行,展示 SmartTV 如何满足两个接口的约定。它可以像任何实现 Powerable 的设备一样开关机,也可以像任何实现 VolumeControl 的设备一样调节音量!
亲手试试
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入
String brand = scanner.nextLine();
int volumeLevel = scanner.nextInt();
// TODO:使用给定的品牌创建一个 SmartTV 对象
// TODO:调用 powerOn()
// TODO:用给定的音量级别调用 setVolume()
// TODO:使用 getVolume() 输出:Current volume: [volume]
// TODO:调用 powerOff()
}
}
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
面向对象编程中的所有课
自己练习: Java 在线编译器