课程内容:多态(Polymorphism)、多态中的转型(向上转型/向下转型)、instanceof 运算符、抽象类与多态结合、接口多态案例(USB + 笔记本)、内部类(成员内部类/静态成员内部类/局部内部类)
涉及前序知识:继承、抽象类、接口、封装、构造方法、方法重写
提交方式:在
提交\姓名\目录下创建对应的 Java 源文件截止时间:下次上课前
| 项目 | 要求 |
|---|---|
| 包名 | 必须按题目指定的包名创建(全小写) |
| 类名 | 自由命名,但需见名知意 |
| 测试类 | 建议命名为 TestXxx 或 XxxTest |
| 文件名 | 必须与类名一致 |
提交\
└─ 张三\
└─ p1_smarthome\ ← 第 1 题的包
├─ SmartDevice.java ← 接口
├─ Light.java ← 实现类(特有:调色)
├─ AirConditioner.java ← 实现类(特有:定时)
├─ RobotVacuum.java ← 实现类(特有:清洁模式)
└─ SmartHomeController.java ← 测试类(多态 + instanceof + 向下转型)
⚠ 注意:包名必须严格按题目要求书写(全小写),目录结构必须与包结构一致。
包名:p1_smarthome
知识点:接口定义与实现、接口多态(参数/数组)、向上转型、向下转型、instanceof 运算符、调用实现类特有方法、开闭原则
开发一个智能家居控制系统。不同家电的开关方式和运行逻辑不同,但都遵循统一的控制规范:打开 → 运行 → 关闭。此外,每种家电还有各自的特有功能(灯可以调色、空调可以定时、扫地机器人有不同清洁模式)。
请使用 接口多态 + instanceof + 向下转型 来设计,要求:
instanceof 判断设备类型后向下转型,调用特有功能| 方法 | 说明 |
|---|---|
void turnOn() |
打开设备 |
void doWork() |
执行工作 |
void turnOff() |
关闭设备 |
| 成员 | 说明 |
|---|---|
| 私有属性 | location(位置,String,如 "客厅" / "卧室") |
| 构造方法 | Light(String location) |
实现 turnOn() |
输出 "xxx 的灯已打开" |
实现 doWork() |
输出 "xxx 的灯照明中..." |
实现 turnOff() |
输出 "xxx 的灯已关闭" |
| 特有方法 | void changeColor(String color) —— 输出 "xxx 的灯光变为 xxx 色" |
| 成员 | 说明 |
|---|---|
| 私有属性 | roomName(房间名,String)、temperature(温度,int) |
| 构造方法 | AirConditioner(String roomName, int temperature) |
实现 turnOn() |
输出 "xxx 空调已打开,设定温度:xxx℃" |
实现 doWork() |
输出 "xxx 空调制冷中,当前室温正降至 xxx℃..." |
实现 turnOff() |
输出 "xxx 空调已关闭" |
| 特有方法 | void setTimer(int hours) —— 输出 "xxx 空调已设置 xxx 小时后自动关闭" |
| 成员 | 说明 |
|---|---|
| 私有属性 | model(型号,String)、batteryLevel(电量,int,百分比) |
| 构造方法 | RobotVacuum(String model, int batteryLevel) |
实现 turnOn() |
输出 "扫地机器人 xxx 已启动,当前电量:xxx%" |
实现 doWork() |
输出 "扫地机器人 xxx 开始清扫地面..." |
实现 turnOff() |
输出 "扫地机器人 xxx 已完成清扫,自动关闭" |
| 特有方法 | void startCleaningMode(String mode) —— 输出 "扫地机器人 xxx 已切换到 xxx 模式开始清扫"(mode 如 "强力" / "静音" / "边缘") |
SmartHomeController 类(测试类,含 main 方法):
创建设备数组:创建一个 SmartDevice[] 数组,包含至少 5 个设备
SmartDevice light1 = new Light("客厅");
SmartDevice ac = new AirConditioner("主卧", 26);
SmartDevice robot = new RobotVacuum("石头T10", 80);
SmartDevice light2 = new Light("书房");
SmartDevice ac2 = new AirConditioner("次卧", 24);
遍历数组,执行通用工作流程:对每个设备依次调用 turnOn() → doWork() → turnOff()
遍历数组,执行特有功能:使用 instanceof 判断设备类型后向下转型,调用特有方法:
Light → 向下转型 → 调用 changeColor("暖黄")AirConditioner → 向下转型 → 调用 setTimer(4)(4 小时)RobotVacuum → 向下转型 → 调用 startCleaningMode("强力")编写静态方法 startDevice(SmartDevice device, int seconds):
device.turnOn()"设备工作中,请等待" + seconds + "秒..."device.doWork()instanceof 判断类型后向下转型,调用特有方法(与第 3 步逻辑相同)device.turnOff()main 中传入不同类型设备调用此方法SmartDevice device 能传入哪些类型的对象?调用 device.changeColor() 行吗?为什么?SmartSpeaker(智能音箱)实现 SmartDevice,SmartHomeController 需要修改哪些代码?是否符合"开闭原则"?SmartDevice 改为抽象类而不是接口,设计上会有什么不同?还能实现"一个类实现多个规范"吗?========== 智能家居启动 ==========
客厅的灯已打开
客厅的灯照明中...
客厅的灯已关闭
客厅的灯光变为暖黄色
主卧空调已打开,设定温度:26℃
主卧空调制冷中,当前室温正降至 26℃...
主卧空调已关闭
主卧空调已设置 4 小时后自动关闭
扫地机器人 石头T10 已启动,当前电量:80%
扫地机器人 石头T10 开始清扫地面...
扫地机器人 石头T10 已完成清扫,自动关闭
扫地机器人 石头T10 已切换到 强力 模式开始清扫
书房的灯已打开
书房的灯照明中...
书房的灯已关闭
书房的灯光变为暖黄色
次卧空调已打开,设定温度:24℃
次卧空调制冷中,当前室温正降至 24℃...
次卧空调已关闭
次卧空调已设置 4 小时后自动关闭
========== 测试 startDevice 方法 ==========
客厅的灯已打开
设备工作中,请等待10秒...
客厅的灯照明中...
客厅的灯光变为暖黄色
客厅的灯已关闭
提示:
- 在
main中调用startDevice时,可以直接传入数组中的元素,如controller.startDevice(devices[0], 10);instanceof判断的是运行时类型,不是编译时类型- 特有方法只能通过向下转型后的子类引用调用,父类/接口引用无法直接调用
开发一个智能家居控制系统。不同家电的开关方式和运行逻辑不同,但都遵循统一的控制规范:打开 → 运行 → 关闭。
请使用 接口多态 来设计,要求控制器不依赖具体家电类型。
| 方法 | 说明 |
|---|---|
void turnOn() |
打开设备 |
void doWork() |
执行工作 |
void turnOff() |
关闭设备 |
| 成员 | 说明 |
|---|---|
| 私有属性 | location(位置,String,如 "客厅" / "卧室") |
| 构造方法 | Light(String location) |
实现 turnOn() |
输出 "xxx 的灯已打开" |
实现 doWork() |
输出 "xxx 的灯照明中..." |
实现 turnOff() |
输出 "xxx 的灯已关闭" |
| 成员 | 说明 |
|---|---|
| 私有属性 | roomName(房间名,String)、temperature(温度,int) |
| 构造方法 | AirConditioner(String roomName, int temperature) |
实现 turnOn() |
输出 "xxx 空调已打开,设定温度:xxx℃" |
实现 doWork() |
输出 "xxx 空调制冷中,当前室温正降至 xxx℃..." |
实现 turnOff() |
输出 "xxx 空调已关闭" |
| 成员 | 说明 |
|---|---|
| 私有属性 | model(型号,String)、batteryLevel(电量,int,百分比) |
| 构造方法 | RobotVacuum(String model, int batteryLevel) |
实现 turnOn() |
输出 "扫地机器人 xxx 已启动,当前电量:xxx%" |
实现 doWork() |
输出 "扫地机器人 xxx 开始清扫地面..." |
实现 turnOff() |
输出 "扫地机器人 xxx 已完成清扫,自动关闭" |
SmartHomeController 类:
创建设备数组:SmartDevice[] 数组,包含至少 4 个设备
SmartDevice light1 = new Light("客厅");
SmartDevice ac = new AirConditioner("主卧", 26);
SmartDevice robot = new RobotVacuum("石头T10", 80);
SmartDevice light2 = new Light("书房");
遍历执行工作流程:对每个设备依次调用 turnOn() → doWork() → turnOff()
编写静态方法 startDevice(SmartDevice device, int seconds):
device.turnOn()"设备工作中,请等待" + seconds + "秒..."device.doWork()device.turnOff()main 中用不同类型设备调用该方法SmartDevice device 可以传入哪些类型的对象?这体现了多态的什么好处?SmartSpeaker 实现 SmartDevice,控制器需要修改吗?NoteBook.useUsb(Usb usb) 案例,设计思路有什么相似之处?========== 智能家居启动 ==========
客厅的灯已打开
客厅的灯照明中...
客厅的灯已关闭
主卧空调已打开,设定温度:26℃
主卧空调制冷中,当前室温正降至 26℃...
主卧空调已关闭
扫地机器人 石头T10 已启动,当前电量:80%
扫地机器人 石头T10 开始清扫地面...
扫地机器人 石头T10 已完成清扫,自动关闭
书房的灯已打开
书房的灯照明中...
书房的灯已关闭
========== 测试 startDevice 方法 ==========
客厅的灯已打开
设备工作中,请等待10秒...
客厅的灯照明中...
客厅的灯已关闭
| 题号 | 名称 | 核心知识点 | 难度 |
|---|---|---|---|
| 第 1 题 | 智能家居控制系统 | 接口多态、向上转型/向下转型、instanceof、调用实现类特有方法、开闭原则 | ⭐⭐⭐ |