Browse Source

refactor: 合并课后作业第1、2题——将多态/转型/instanceof知识点融入智能家居控制系统,保留内部类第2题,作业由3题缩减为2题

WanJL 11 hours ago
parent
commit
6879b9ae6f
1 changed files with 103 additions and 85 deletions
  1. 103 85
      课后作业/2026年7月24日-作业.md

+ 103 - 85
课后作业/2026年7月24日-作业.md

@@ -26,19 +26,13 @@
 ```
 ```
 提交\
 提交\
 └─ 张三\
 └─ 张三\
-    ├─ p1_zoo\                   ← 第 1 题的包
-    │   ├─ Animal.java             ← 抽象父类
-    │   ├─ Lion.java               ← 子类
-    │   ├─ Penguin.java            ← 子类
-    │   ├─ Parrot.java             ← 子类
-    │   └─ ZooGuide.java           ← 测试类(多态 + instanceof)
-    ├─ p2_smarthome\             ← 第 2 题的包
+    ├─ p1_smarthome\             ← 第 1 题的包
     │   ├─ SmartDevice.java        ← 接口
     │   ├─ SmartDevice.java        ← 接口
-    │   ├─ Light.java              ← 实现类
-    │   ├─ AirConditioner.java     ← 实现类
-    │   ├─ RobotVacuum.java        ← 实现类
-    │   └─ SmartHomeController.java ← 测试类
-    └─ p3_computer\              ← 第 3 题的包
+    │   ├─ Light.java              ← 实现类(特有:调色)
+    │   ├─ AirConditioner.java     ← 实现类(特有:定时)
+    │   ├─ RobotVacuum.java        ← 实现类(特有:清洁模式)
+    │   └─ SmartHomeController.java ← 测试类(多态 + instanceof + 向下转型)
+    └─ p2_computer\              ← 第 2 题的包
         ├─ Computer.java           ← 外部类(含内部类)
         ├─ Computer.java           ← 外部类(含内部类)
         └─ TestComputer.java       ← 测试类
         └─ TestComputer.java       ← 测试类
 ```
 ```
@@ -47,116 +41,141 @@
 
 
 ---
 ---
 
 
-## 第 1 题:多态 + 转型 + instanceof——动物园导游系统 ⭐⭐⭐
+## 第 1 题:接口多态 + 转型 + instanceof——智能家居控制系统 ⭐⭐⭐
 
 
-**包名**:`p1_zoo`
+**包名**:`p1_smarthome`
 
 
-**知识点**:多态、向上转型/向下转型、instanceof 运算符、抽象类、调用子类特有方法
+**知识点**:接口定义与实现、接口多态(参数/数组)、向上转型、向下转型、instanceof 运算符、调用实现类特有方法、开闭原则
 
 
 ### 需求说明
 ### 需求说明
 
 
-某动物园需要开发一个**导游讲解系统**。动物园里有多种动物,每种动物都有**共同的行为**(进食、睡觉),也有**各自的特有行为**(有的会吼叫、有的会游泳、有的会模仿说话)。导游需要根据不同动物类型进行不同的讲解
+开发一个**智能家居控制系统**。不同家电的开关方式和运行逻辑不同,但都遵循统一的控制规范:**打开 → 运行 → 关闭**。此外,每种家电还有**各自的特有功能**(灯可以调色、空调可以定时、扫地机器人有不同清洁模式)
 
 
-请使用 **抽象父类 + 多态 + instanceof + 向下转型** 来设计。
+请使用 **接口多态 + instanceof + 向下转型** 来设计,要求:
+- 控制器通过接口类型操作所有设备(多态)
+- 通过 `instanceof` 判断设备类型后向下转型,调用特有功能
 
 
-### 类设计
+### 接口设计
 
 
-#### Animal 抽象类(父类)
+#### SmartDevice 接口
 
 
-| 成员 | 说明 |
+| 方法 | 说明 |
 |------|------|
 |------|------|
-| 私有属性 | `name`(名称,String)、`age`(年龄,int) |
-| 构造方法 | `Animal(String name, int age)` |
-| 抽象方法 | `void eat()` |
-| 抽象方法 | `void sleep()` |
-| 普通方法 | `void showInfo()` —— 输出 `"动物:xxx,年龄:xxx岁"` |
+| `void turnOn()` | 打开设备 |
+| `void doWork()` | 执行工作 |
+| `void turnOff()` | 关闭设备 |
 
 
-#### Lion 类(狮子——继承 Animal)
+### 实现类要求
+
+#### Light 类(灯——实现 SmartDevice)
 
 
 | 成员 | 说明 |
 | 成员 | 说明 |
 |------|------|
 |------|------|
-| 构造方法 | `Lion(String name, int age)` |
-| 重写 `eat()` | 输出 `"狮子 xxx 正在吃肉..."` |
-| 重写 `sleep()` | 输出 `"狮子 xxx 在洞穴里睡觉..."` |
-| **特有** `roar()` | 输出 `"狮子 xxx 发出吼叫:嗷呜~~"` |
+| 私有属性 | `location`(位置,String,如 "客厅" / "卧室") |
+| 构造方法 | `Light(String location)` |
+| 实现 `turnOn()` | 输出 `"xxx 的灯已打开"` |
+| 实现 `doWork()` | 输出 `"xxx 的灯照明中..."` |
+| 实现 `turnOff()` | 输出 `"xxx 的灯已关闭"` |
+| **特有方法** | `void changeColor(String color)` —— 输出 `"xxx 的灯光变为 xxx 色"` |
 
 
-#### Penguin 类(企鹅——继承 Animal)
+#### AirConditioner 类(空调——实现 SmartDevice
 
 
 | 成员 | 说明 |
 | 成员 | 说明 |
 |------|------|
 |------|------|
-| 构造方法 | `Penguin(String name, int age)` |
-| 重写 `eat()` | 输出 `"企鹅 xxx 正在吃鱼..."` |
-| 重写 `sleep()` | 输出 `"企鹅 xxx 站着睡觉..."` |
-| **特有** `swim()` | 输出 `"企鹅 xxx 在水中游泳..."` |
+| 私有属性 | `roomName`(房间名,String)、`temperature`(温度,int) |
+| 构造方法 | `AirConditioner(String roomName, int temperature)` |
+| 实现 `turnOn()` | 输出 `"xxx 空调已打开,设定温度:xxx℃"` |
+| 实现 `doWork()` | 输出 `"xxx 空调制冷中,当前室温正降至 xxx℃..."` |
+| 实现 `turnOff()` | 输出 `"xxx 空调已关闭"` |
+| **特有方法** | `void setTimer(int hours)` —— 输出 `"xxx 空调已设置 xxx 小时后自动关闭"` |
 
 
-#### Parrot 类(鹦鹉——继承 Animal)
+#### RobotVacuum 类(扫地机器人——实现 SmartDevice
 
 
 | 成员 | 说明 |
 | 成员 | 说明 |
 |------|------|
 |------|------|
-| 私有属性 | `vocabulary`(词汇量,int) |
-| 构造方法 | `Parrot(String name, int age, int vocabulary)` |
-| 重写 `eat()` | 输出 `"鹦鹉 xxx 正在啄食谷物..."` |
-| 重写 `sleep()` | 输出 `"鹦鹉 xxx 挂在树枝上睡觉..."` |
-| **特有** `imitate()` | 输出 `"鹦鹉 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 如 "强力" / "静音" / "边缘") |
 
 
 ### 测试类要求
 ### 测试类要求
 
 
-**`ZooGuide` 类**
+**`SmartHomeController` 类**(测试类,含 main 方法)
 
 
-1. **创建动物数组**:`Animal[]` 数组,包含至少 4 种动物
+1. **创建设备数组**:创建一个 `SmartDevice[]` 数组,包含至少 5 个设备
 
 
    ```java
    ```java
-   Animal a1 = new Lion("辛巴", 5);
-   Animal a2 = new Penguin("乐乐", 2);
-   Animal a3 = new Parrot("小彩虹", 1, 50);
-   Animal a4 = new Lion("娜娜", 4);
+   SmartDevice light1 = new Light("客厅");
+   SmartDevice ac = new AirConditioner("主卧", 26);
+   SmartDevice robot = new RobotVacuum("石头T10", 80);
+   SmartDevice light2 = new Light("书房");
+   SmartDevice ac2 = new AirConditioner("次卧", 24);
    ```
    ```
 
 
-2. **遍历执行通用行为**:调用每个元素的 `showInfo()`、`eat()`、`sleep()`
+2. **遍历数组,执行通用工作流程**:对每个设备依次调用 `turnOn()` → `doWork()` → `turnOff()`
+
+3. **遍历数组,执行特有功能**:使用 `instanceof` 判断设备类型后向下转型,调用特有方法:
+   - 如果是 `Light` → 向下转型 → 调用 `changeColor("暖黄")`
+   - 如果是 `AirConditioner` → 向下转型 → 调用 `setTimer(4)`(4 小时)
+   - 如果是 `RobotVacuum` → 向下转型 → 调用 `startCleaningMode("强力")`
 
 
-3. **遍历执行特有行为**:使用 `instanceof` 判断类型后向下转型
-   - `Lion` → `roar()`
-   - `Penguin` → `swim()`
-   - `Parrot` → `imitate()`
+4. **编写静态方法 `startDevice(SmartDevice device, int seconds)`**:
+   - 调用 `device.turnOn()`
+   - 输出 `"设备工作中,请等待" + seconds + "秒..."`
+   - 调用 `device.doWork()`
+   - 使用 `instanceof` 判断类型后向下转型,调用特有方法(与第 3 步逻辑相同)
+   - 调用 `device.turnOff()`
+   - 在 `main` 中传入不同类型设备调用此方法
 
 
 ### 思考题
 ### 思考题
 
 
-1. 为什么 `Animal` 要设计为抽象类?用普通父类可以吗
-2. 如果不用 `instanceof` 直接向下转型,传入 `Penguin` 时强转为 `(Lion)` 会怎样
-3. 如果新增 `Elephant` 类,需要修改 `ZooGuide` 吗?这符合什么设计原则
+1. 方法参数 `SmartDevice device` 能传入哪些类型的对象?调用 `device.changeColor()` 行吗?为什么
+2. 如果新增一个 `SmartSpeaker`(智能音箱)实现 `SmartDevice`,`SmartHomeController` 需要修改哪些代码?是否符合"开闭原则"
+3. 如果将 `SmartDevice` 改为抽象类而不是接口,设计上会有什么不同?还能实现"一个类实现多个规范"吗
 
 
 ### 预期输出
 ### 预期输出
 
 
 ```
 ```
-========== 动物园导游系统 ==========
-动物:辛巴,年龄:5岁
-狮子 辛巴 正在吃肉...
-狮子 辛巴 在洞穴里睡觉...
-狮子 辛巴 发出吼叫:嗷呜~~
-
-动物:乐乐,年龄:2岁
-企鹅 乐乐 正在吃鱼...
-企鹅 乐乐 站着睡觉...
-企鹅 乐乐 在水中游泳...
-
-动物:小彩虹,年龄:1岁
-鹦鹉 小彩虹 正在啄食谷物...
-鹦鹉 小彩虹 挂在树枝上睡觉...
-鹦鹉 小彩虹 模仿人类说话:你好!词汇量:50个
-
-动物:娜娜,年龄:4岁
-狮子 娜娜 正在吃肉...
-狮子 娜娜 在洞穴里睡觉...
-狮子 娜娜 发出吼叫:嗷呜~~
-```
+========== 智能家居启动 ==========
+客厅的灯已打开
+客厅的灯照明中...
+客厅的灯已关闭
+客厅的灯光变为暖黄色
 
 
----
+主卧空调已打开,设定温度:26℃
+主卧空调制冷中,当前室温正降至 26℃...
+主卧空调已关闭
+主卧空调已设置 4 小时后自动关闭
 
 
-## 第 2 题:接口多态——智能家居控制系统 ⭐⭐⭐
+扫地机器人 石头T10 已启动,当前电量:80%
+扫地机器人 石头T10 开始清扫地面...
+扫地机器人 石头T10 已完成清扫,自动关闭
+扫地机器人 石头T10 已切换到 强力 模式开始清扫
+
+书房的灯已打开
+书房的灯照明中...
+书房的灯已关闭
+书房的灯光变为暖黄色
 
 
-**包名**:`p2_smarthome`
+次卧空调已打开,设定温度:24℃
+次卧空调制冷中,当前室温正降至 24℃...
+次卧空调已关闭
+次卧空调已设置 4 小时后自动关闭
+
+========== 测试 startDevice 方法 ==========
+客厅的灯已打开
+设备工作中,请等待10秒...
+客厅的灯照明中...
+客厅的灯光变为暖黄色
+客厅的灯已关闭
+```
 
 
-**知识点**:接口定义、implements 实现接口、接口多态、多态参数、多态数组
+> **提示**:
+> - 在 `main` 中调用 `startDevice` 时,可以直接传入数组中的元素,如 `controller.startDevice(devices[0], 10);`
+> - `instanceof` 判断的是**运行时类型**,不是编译时类型
+> - 特有方法只能通过**向下转型**后的子类引用调用,父类/接口引用无法直接调用
 
 
 ### 需求说明
 ### 需求说明
 
 
@@ -261,9 +280,9 @@
 
 
 ---
 ---
 
 
-## 第 3 题:内部类——计算机硬件体系 ⭐⭐⭐
+## 第 2 题:内部类——计算机硬件体系 ⭐⭐⭐
 
 
-**包名**:`p3_computer`
+**包名**:`p2_computer`
 
 
 **知识点**:成员内部类、私有内部类、内部类访问外部类私有成员、外部类通过方法暴露内部类
 **知识点**:成员内部类、私有内部类、内部类访问外部类私有成员、外部类通过方法暴露内部类
 
 
@@ -353,6 +372,5 @@ CPU:酷睿 i7,主频:3.2 GHz
 
 
 | 题号 | 名称 | 核心知识点 | 难度 |
 | 题号 | 名称 | 核心知识点 | 难度 |
 |------|------|-----------|------|
 |------|------|-----------|------|
-| 第 1 题 | 动物园导游系统 | 抽象类、多态、向上转型/向下转型、instanceof、调用子类特有方法 | ⭐⭐⭐ |
-| 第 2 题 | 智能家居控制系统 | 接口多态、多态参数、多态数组、开闭原则 | ⭐⭐⭐ |
-| 第 3 题 | 计算机硬件体系 | 成员内部类、私有内部类、内部类访问外部类私有成员 | ⭐⭐⭐ |
+| 第 1 题 | 智能家居控制系统 | 接口多态、向上转型/向下转型、instanceof、调用实现类特有方法、开闭原则 | ⭐⭐⭐ |
+| 第 2 题 | 计算机硬件体系 | 成员内部类、私有内部类、内部类访问外部类私有成员 | ⭐⭐⭐ |