|
|
@@ -4,93 +4,96 @@
|
|
|
|
|
|
---
|
|
|
|
|
|
-## 练习 1:静态成员内部类——电脑硬件升级(显卡与硬盘)⭐⭐
|
|
|
+## 练习 1:静态成员内部类——餐厅菜单与厨师信息 ⭐⭐
|
|
|
|
|
|
**知识点**:静态成员内部类、`static` 修饰内部类的特点、静态内部类的创建格式、静态内部类与外部类的关系
|
|
|
|
|
|
### 需求说明
|
|
|
|
|
|
-在之前的练习中,我们使用 **普通成员内部类** 设计了计算机的 CPU 和内存。这次,我们换成 **静态成员内部类** 来设计电脑的 **显卡(GraphicsCard)** 和 **硬盘(HardDisk)**,体验静态内部类在创建方式和访问权限上的不同。
|
|
|
+餐厅(Restaurant)有自己的 **菜单项(MenuItem)** 和 **厨师(Chef)**。菜单项和厨师信息可以脱离具体的餐厅实例独立存在(例如连锁餐厅采用统一标准),但它们在业务逻辑上又属于餐厅的一部分。请使用 **静态成员内部类(`static` 修饰)** 来设计这个体系。
|
|
|
|
|
|
-> 显卡和硬盘同样是计算机的重要部件,但使用 `static` 修饰后,它们可以不依赖外部类实例而独立创建。
|
|
|
+> 静态内部类使用 `static` 修饰,创建时**不需要**先创建外部类对象,格式为 `new 外部类名.内部类名(...)`。
|
|
|
|
|
|
### 类设计
|
|
|
|
|
|
-#### Computer 类(外部类)
|
|
|
+#### Restaurant 类(外部类)
|
|
|
|
|
|
| 成员 | 说明 |
|
|
|
|------|------|
|
|
|
-| 私有属性 | `brand`(品牌,String)、`price`(价格,double) |
|
|
|
-| 构造方法 | `Computer(String brand, double price)` |
|
|
|
-| 方法 | `void showInfo()` —— 输出电脑品牌和价格 |
|
|
|
-| 方法 | `void startComputer()` —— 输出启动信息,调用显卡的 `render()` 和硬盘的 `readData()` |
|
|
|
+| 私有属性 | `name`(店名,String)、`address`(地址,String) |
|
|
|
+| 构造方法 | `Restaurant(String name, String address)` |
|
|
|
+| 方法 | `void showInfo()` —— 输出 `"xxx(地址:xxx)"` |
|
|
|
+| 方法 | `void openRestaurant()` —— 输出餐厅开业信息,依次调用每个厨师和菜单项的方法 |
|
|
|
|
|
|
-#### GraphicsCard 类(**静态成员内部类**)
|
|
|
+#### MenuItem 类(**静态成员内部类**)
|
|
|
|
|
|
| 成员 | 说明 |
|
|
|
|------|------|
|
|
|
-| 私有属性 | `model`(型号,String)、`vram`(显存,int,单位 GB) |
|
|
|
-| 构造方法 | `GraphicsCard(String model, int vram)` |
|
|
|
-| 方法 | `void render()` —— 输出 `"显卡(xxx,xxx GB)正在渲染画面..."` |
|
|
|
-| 方法 | `void showSpec()` —— 输出 `"显卡规格:xxx,显存:xxx GB"` |
|
|
|
+| 私有属性 | `dishName`(菜品名,String)、`price`(价格,double) |
|
|
|
+| 构造方法 | `MenuItem(String dishName, double price)` |
|
|
|
+| 方法 | `void showDish()` —— 输出 `"xxx —— ¥xxx"` |
|
|
|
+| 方法 | `void describe()` —— 输出 `"这是 xxx,价格 ¥xxx,欢迎品尝"` |
|
|
|
|
|
|
-#### HardDisk 类(**静态成员内部类**)
|
|
|
+#### Chef 类(**静态成员内部类**)
|
|
|
|
|
|
| 成员 | 说明 |
|
|
|
|------|------|
|
|
|
-| 私有属性 | `capacity`(容量,int,单位 GB)、`type`(类型,String,如 "SSD" / "HDD") |
|
|
|
-| 构造方法 | `HardDisk(int capacity, String type)` |
|
|
|
-| 方法 | `void readData()` —— 输出 `"硬盘(xxx GB,xxx)正在读取数据..."` |
|
|
|
-| 方法 | `void writeData()` —— 输出 `"硬盘(xxx GB,xxx)正在写入数据..."` |
|
|
|
+| 私有属性 | `name`(姓名,String)、`specialty`(拿手菜,String) |
|
|
|
+| 构造方法 | `Chef(String name, String specialty)` |
|
|
|
+| 方法 | `void cook()` —— 输出 `"厨师 xxx 正在烹饪拿手菜:xxx"` |
|
|
|
+| 方法 | `void showInfo()` —— 输出 `"厨师:xxx \| 拿手菜:xxx"` |
|
|
|
|
|
|
### 测试类要求
|
|
|
|
|
|
-**`TestComputer2` 类**:
|
|
|
+**`TestRestaurant` 类**:
|
|
|
|
|
|
-1. **直接创建显卡对象**:
|
|
|
+1. **直接创建菜单项对象**(不依赖 Restaurant 实例):
|
|
|
```java
|
|
|
- Computer.GraphicsCard gpu = new Computer.GraphicsCard("RTX 4070", 12);
|
|
|
+ Restaurant.MenuItem item1 = new Restaurant.MenuItem("宫保鸡丁", 38.0);
|
|
|
+ Restaurant.MenuItem item2 = new Restaurant.MenuItem("麻婆豆腐", 28.0);
|
|
|
```
|
|
|
- > 静态内部类 **不需要** 先创建外部类对象,格式为 `外部类名.内部类名`
|
|
|
+ > 静态内部类的创建格式:`外部类名.内部类名 对象名 = new 外部类名.内部类名(...)`
|
|
|
|
|
|
-2. **直接创建硬盘对象**:
|
|
|
+2. **直接创建厨师对象**(不依赖 Restaurant 实例):
|
|
|
```java
|
|
|
- Computer.HardDisk disk = new Computer.HardDisk(1024, "SSD");
|
|
|
+ Restaurant.Chef chef1 = new Restaurant.Chef("王师傅", "宫保鸡丁");
|
|
|
+ Restaurant.Chef chef2 = new Restaurant.Chef("李师傅", "麻婆豆腐");
|
|
|
```
|
|
|
|
|
|
-3. 调用显卡的 `showSpec()` 和 `render()` 方法
|
|
|
+3. 分别调用菜单项和厨师的方法展示信息
|
|
|
|
|
|
-4. 调用硬盘的 `readData()` 和 `writeData()` 方法
|
|
|
+4. 创建 `Restaurant` 对象("川味轩", "北京市海淀区"),调用 `openRestaurant()`
|
|
|
|
|
|
-5. 创建 `Computer` 对象("华硕", 8999.0),调用 `startComputer()`
|
|
|
-
|
|
|
-6. **尝试**:在 GraphicsCard 的 `render()` 方法中直接访问外部类的 `brand` 属性——观察是否编译报错
|
|
|
+5. **尝试**:在 `Chef` 的 `cook()` 方法中直接访问外部类的 `name` 属性——观察是否编译报错,理解静态内部类的访问限制
|
|
|
|
|
|
### 思考题
|
|
|
|
|
|
-1. 静态内部类和普通成员内部类在 **创建方式** 上有什么区别?从 `new` 的语法角度分析。
|
|
|
+1. 静态内部类和普通成员内部类在 **创建方式** 上有什么区别?从 `new` 的语法角度具体说明。
|
|
|
|
|
|
-2. 静态内部类能否直接访问外部类的 **实例成员**(如 `brand`、`price`)?为什么?
|
|
|
+2. 静态内部类能否直接访问外部类的 **实例成员**(如 `name`、`address`)?为什么?
|
|
|
|
|
|
-3. 如果确实需要在静态内部类中访问外部类的实例成员,应该如何改造代码?(提示:通过参数传递外部类引用)
|
|
|
+3. 如果确实需要在静态内部类中访问外部类的实例成员,应该如何改造代码?(提示:通过参数将外部类引用传入静态内部类)
|
|
|
|
|
|
-4. 对比之前的 CPU(成员内部类)和现在的 GraphicsCard(静态内部类),哪种内部类更适合描述"计算机的部件"这个场景?说说你的理由。
|
|
|
+4. 在这个场景中,`MenuItem` 和 `Chef` 设计为静态内部类是否合理?如果改为普通成员内部类,会对创建方式产生什么影响?
|
|
|
|
|
|
### 预期输出
|
|
|
|
|
|
```
|
|
|
-========== 独立创建显卡 ==========
|
|
|
-显卡规格:RTX 4070,显存:12 GB
|
|
|
-显卡(RTX 4070,12 GB)正在渲染画面...
|
|
|
-
|
|
|
-========== 独立创建硬盘 ==========
|
|
|
-硬盘(1024 GB,SSD)正在读取数据...
|
|
|
-硬盘(1024 GB,SSD)正在写入数据...
|
|
|
-
|
|
|
-========== 启动计算机 ==========
|
|
|
-计算机 华硕 正在启动...
|
|
|
-显卡(RTX 4070,12 GB)正在渲染画面...
|
|
|
-硬盘(1024 GB,SSD)正在读取数据...
|
|
|
+========== 菜单信息 ==========
|
|
|
+宫保鸡丁 —— ¥38.0
|
|
|
+这是 宫保鸡丁,价格 ¥38.0,欢迎品尝
|
|
|
+麻婆豆腐 —— ¥28.0
|
|
|
+这是 麻婆豆腐,价格 ¥28.0,欢迎品尝
|
|
|
+
|
|
|
+========== 厨师信息 ==========
|
|
|
+厨师:王师傅 | 拿手菜:宫保鸡丁
|
|
|
+厨师:李师傅 | 拿手菜:麻婆豆腐
|
|
|
+
|
|
|
+========== 餐厅开业 ==========
|
|
|
+川味轩(地址:北京市海淀区)开业啦!
|
|
|
+厨师 王师傅 正在烹饪拿手菜:宫保鸡丁
|
|
|
+厨师 李师傅 正在烹饪拿手菜:麻婆豆腐
|
|
|
+欢迎莅临品尝!
|
|
|
```
|
|
|
|
|
|
---
|