|
@@ -0,0 +1,265 @@
|
|
|
|
|
+# 2026-07-21 JavaSE 课后作业
|
|
|
|
|
+
|
|
|
|
|
+> **课程内容**:构造方法(构造器)—— 无参构造、有参构造、构造方法重载、this() 调用、封装综合应用
|
|
|
|
|
+>
|
|
|
|
|
+> **涉及前序知识**:封装、对象数组、Random、Scanner、冒泡排序、数组遍历
|
|
|
|
|
+>
|
|
|
|
|
+> **提交方式**:在 `提交\姓名\` 目录下创建对应的 Java 源文件
|
|
|
|
|
+>
|
|
|
|
|
+> **截止时间**:下次上课前
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 📌 本次作业重要说明
|
|
|
|
|
+
|
|
|
|
|
+### 命名要求变更
|
|
|
|
|
+
|
|
|
|
|
+与以往作业不同,本次作业**不再要求类名按指定格式命名**,而是要求**包名按指定格式命名**。
|
|
|
|
|
+
|
|
|
|
|
+| 变化 | 之前的要求 | 本次的要求 |
|
|
|
|
|
+|------|-----------|-----------|
|
|
|
|
|
+| 类名 | 必须按 `Demo_XX_姓名` 格式命名 | 自由命名(见下文要求) |
|
|
|
|
|
+| 包名 | 不要求(默认包) | **必须按指定包名创建** |
|
|
|
|
|
+| 文件名 | 必须与类名一致 | 与类名一致即可 |
|
|
|
|
|
+
|
|
|
|
|
+### 具体要求
|
|
|
|
|
+
|
|
|
|
|
+1. **每个题目对应一个独立的包**,包名在题目中已指定
|
|
|
|
|
+2. 每个包下包含该题所需的所有类(实体类 + 测试类)
|
|
|
|
|
+3. 类名**自由命名**,但需**见名知意**(如实体类用 `Movie`、`GuessGame`、`BookV2` 等均可)
|
|
|
|
|
+4. 测试类建议命名为 `TestXxx` 或 `XxxTest`(如 `TestMovie`、`GuessGameTest`)
|
|
|
|
|
+5. 每个 Java 源文件顶部需包含以下注释模板:
|
|
|
|
|
+
|
|
|
|
|
+```java
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author 你的姓名
|
|
|
|
|
+ * @title 题目X:题目名称
|
|
|
|
|
+ * @create 2026/7/21
|
|
|
|
|
+ */
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 提交目录结构示例
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+提交\
|
|
|
|
|
+└─ 张三\
|
|
|
|
|
+ ├─ p07_movie\ ← 第 7 题的包
|
|
|
|
|
+ │ ├─ Movie.java ← 实体类(类名自拟)
|
|
|
|
|
+ │ └─ TestMovie.java ← 测试类(类名自拟)
|
|
|
|
|
+ ├─ p08_guessgame\ ← 第 8 题的包
|
|
|
|
|
+ │ ├─ GuessGame.java
|
|
|
|
|
+ │ └─ GuessGameTest.java
|
|
|
|
|
+ └─ p09_bookmanager\ ← 第 9 题的包
|
|
|
|
|
+ ├─ BookV2.java
|
|
|
|
|
+ ├─ BookManager.java
|
|
|
|
|
+ └─ BookManagerTest.java
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> ⚠ **注意**:包名必须严格按题目要求书写(全小写),目录结构必须与包结构一致。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 第 7 题:构造方法 + 对象数组 + 遍历打印——Movie 类 ⭐⭐⭐
|
|
|
|
|
+
|
|
|
|
|
+**包名**:`p07_movie`
|
|
|
|
|
+
|
|
|
|
|
+创建一个电影类(类名自拟),包含:
|
|
|
|
|
+
|
|
|
|
|
+- **私有属性**:`title`(片名)、`director`(导演)、`year`(上映年份,int)、`rating`(评分,double)
|
|
|
|
|
+- **全参构造方法**
|
|
|
|
|
+- **getter/setter**
|
|
|
|
|
+- **方法**:`showInfo()` 输出电影信息
|
|
|
|
|
+
|
|
|
|
|
+**测试类要求**(测试类类名自拟,置于 `p07_movie` 包下):
|
|
|
|
|
+1. 创建一个电影对象数组,存储**至少 4 部电影**
|
|
|
|
|
+2. 使用 **全参构造方法一次性初始化** 所有电影对象(不要用无参构造 + setter)
|
|
|
|
|
+3. 遍历数组,输出**评分最高**的电影信息
|
|
|
|
|
+
|
|
|
|
|
+**示例数据**:
|
|
|
|
|
+```
|
|
|
|
|
+"肖申克的救赎", "弗兰克·德拉邦特", 1994, 9.7
|
|
|
|
|
+"霸王别姬", "陈凯歌", 1993, 9.6
|
|
|
|
|
+"阿甘正传", "罗伯特·泽米吉斯", 1994, 9.5
|
|
|
|
|
+"泰坦尼克号", "詹姆斯·卡梅隆", 1997, 9.4
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**示例输出**:
|
|
|
|
|
+```
|
|
|
|
|
+========== 所有电影信息 ==========
|
|
|
|
|
+肖申克的救赎 (弗兰克·德拉邦特, 1994) 评分:9.7
|
|
|
|
|
+霸王别姬 (陈凯歌, 1993) 评分:9.6
|
|
|
|
|
+阿甘正传 (罗伯特·泽米吉斯, 1994) 评分:9.5
|
|
|
|
|
+泰坦尼克号 (詹姆斯·卡梅隆, 1997) 评分:9.4
|
|
|
|
|
+
|
|
|
|
|
+========== 评分最高的电影 ==========
|
|
|
|
|
+肖申克的救赎 (弗兰克·德拉邦特, 1994) 评分:9.7
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 💡 **提示**:找评分最高的电影 → 遍历数组,用变量记录最大值及其下标或对象引用。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 第 8 题:构造方法 + Random + 方法——猜数游戏(面向对象版)⭐⭐⭐⭐
|
|
|
|
|
+
|
|
|
|
|
+**包名**:`p08_guessgame`
|
|
|
|
|
+
|
|
|
|
|
+将之前的猜数字游戏改造为**面向对象版本**,使用构造方法初始化游戏。
|
|
|
|
|
+
|
|
|
|
|
+### 游戏类(类名自拟,置于 `p08_guessgame` 包下)
|
|
|
|
|
+
|
|
|
|
|
+**私有属性**:
|
|
|
|
|
+
|
|
|
|
|
+| 属性 | 类型 | 说明 |
|
|
|
|
|
+|------|------|------|
|
|
|
|
|
+| `target` | int | 目标数字(系统随机生成) |
|
|
|
|
|
+| `maxRange` | int | 最大范围(如 100 表示 1~100) |
|
|
|
|
|
+| `attempts` | int | 已猜次数 |
|
|
|
|
|
+
|
|
|
|
|
+**构造方法**:`类名(int maxRange)` —— 在 `1 ~ maxRange` 之间用 Random 生成目标数字,并将 `attempts` 初始化为 0
|
|
|
|
|
+
|
|
|
|
|
+**方法**:
|
|
|
|
|
+
|
|
|
|
|
+| 方法 | 说明 |
|
|
|
|
|
+|------|------|
|
|
|
|
|
+| `guess(int num)` | 判断猜测结果,返回 `String`:`"猜对了!"` / `"大了,再小点"` / `"小了,再大点"` |
|
|
|
|
|
+| `getAttempts()` | 返回已猜次数(int) |
|
|
|
|
|
+
|
|
|
|
|
+### 测试类要求(测试类类名自拟,置于 `p08_guessgame` 包下)
|
|
|
|
|
+
|
|
|
|
|
+1. 创建游戏对象,范围 1~100
|
|
|
|
|
+2. 使用 `Scanner` 让用户循环输入猜测数字
|
|
|
|
|
+3. 调用 `guess()` 方法判断,直到猜对为止
|
|
|
|
|
+4. 猜对后输出总共猜了多少次
|
|
|
|
|
+
|
|
|
|
|
+**示例运行效果**:
|
|
|
|
|
+```
|
|
|
|
|
+======= 猜数游戏(1~100) =======
|
|
|
|
|
+请输入你猜的数字:50
|
|
|
|
|
+小了,再大点
|
|
|
|
|
+请输入你猜的数字:75
|
|
|
|
|
+大了,再小点
|
|
|
|
|
+请输入你猜的数字:62
|
|
|
|
|
+小了,再大点
|
|
|
|
|
+请输入你猜的数字:68
|
|
|
|
|
+猜对了!
|
|
|
|
|
+恭喜你!一共猜了 4 次
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 💡 **提示**:
|
|
|
|
|
+> - 构造方法中使用 `Random` 的 `nextInt(maxRange) + 1` 生成 1~maxRange 的随机数
|
|
|
|
|
+> - `guess()` 方法中每次调用时 `attempts` 自增 1
|
|
|
|
|
+> - 测试类中使用 `while(true)` 循环,猜对时 `break`
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 第 9 题:构造方法 + 封装 + 对象数组 + 排序——BookManager ⭐⭐⭐⭐
|
|
|
|
|
+
|
|
|
|
|
+**包名**:`p09_bookmanager`
|
|
|
|
|
+
|
|
|
|
|
+### 图书类(类名自拟,置于 `p09_bookmanager` 包下)
|
|
|
|
|
+
|
|
|
|
|
+- **私有属性**:`id`(编号,int)、`title`(书名,String)、`price`(价格,double)
|
|
|
|
|
+- **全参构造方法**
|
|
|
|
|
+- **getter/setter**
|
|
|
|
|
+
|
|
|
|
|
+### 管理类(类名自拟,置于 `p09_bookmanager` 包下)
|
|
|
|
|
+
|
|
|
|
|
+包含以下方法:
|
|
|
|
|
+
|
|
|
|
|
+| 方法 | 说明 |
|
|
|
|
|
+|------|------|
|
|
|
|
|
+| `initBooks()` | 创建并返回一个包含 **5 本图书** 的数组(使用全参构造初始化) |
|
|
|
|
|
+| `printBooks(图书数组类型 books)` | 遍历输出所有图书信息 |
|
|
|
|
|
+| `sortByPrice(图书数组类型 books)` | 按价格**从高到低**排序(冒泡排序) |
|
|
|
|
|
+| `searchByTitle(图书数组类型 books, String title)` | 根据书名查找图书,返回找到的图书对象(找不到返回 `null`) |
|
|
|
|
|
+
|
|
|
|
|
+### 测试类要求(测试类类名自拟,置于 `p09_bookmanager` 包下)
|
|
|
|
|
+
|
|
|
|
|
+1. 调用 `initBooks()` 初始化图书数组
|
|
|
|
|
+2. 调用 `printBooks()` 输出原始顺序
|
|
|
|
|
+3. 调用 `sortByPrice()` 排序后再次输出
|
|
|
|
|
+4. 调用 `searchByTitle()` 查找某本书,输出查找结果
|
|
|
|
|
+
|
|
|
|
|
+**示例数据**:
|
|
|
|
|
+```java
|
|
|
|
|
+new 图书类(1001, "Java从入门到精通", 79.0)
|
|
|
|
|
+new 图书类(1002, "数据结构与算法", 65.0)
|
|
|
|
|
+new 图书类(1003, "设计模式之禅", 58.0)
|
|
|
|
|
+new 图书类(1004, "深入理解JVM", 89.0)
|
|
|
|
|
+new 图书类(1005, "计算机网络", 45.0)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**示例运行效果**:
|
|
|
|
|
+```
|
|
|
|
|
+========== 原始顺序 ==========
|
|
|
|
|
+编号:1001,书名:Java从入门到精通,价格:79.0
|
|
|
|
|
+编号:1002,书名:数据结构与算法,价格:65.0
|
|
|
|
|
+编号:1003,书名:设计模式之禅,价格:58.0
|
|
|
|
|
+编号:1004,书名:深入理解JVM,价格:89.0
|
|
|
|
|
+编号:1005,书名:计算机网络,价格:45.0
|
|
|
|
|
+
|
|
|
|
|
+========== 按价格从高到低排序 ==========
|
|
|
|
|
+编号:1004,书名:深入理解JVM,价格:89.0
|
|
|
|
|
+编号:1001,书名:Java从入门到精通,价格:79.0
|
|
|
|
|
+编号:1002,书名:数据结构与算法,价格:65.0
|
|
|
|
|
+编号:1003,书名:设计模式之禅,价格:58.0
|
|
|
|
|
+编号:1005,书名:计算机网络,价格:45.0
|
|
|
|
|
+
|
|
|
|
|
+========== 查找图书 ==========
|
|
|
|
|
+查找 "设计模式之禅":
|
|
|
|
|
+ 找到了!编号:1003,价格:58.0
|
|
|
|
|
+
|
|
|
|
|
+查找 "操作系统":
|
|
|
|
|
+ 未找到该图书!
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> 💡 **提示**:
|
|
|
|
|
+> - `initBooks()` 是**无参有返回值**方法,在方法内部创建数组并返回
|
|
|
|
|
+> - 冒泡排序中比较价格时,使用 `>` 进行降序排列(从高到低)
|
|
|
|
|
+> - `searchByTitle()` 使用 `equals()` 或 `equalsIgnoreCase()` 比较书名
|
|
|
|
|
+> - 管理类的方法都是**实例方法**,测试类中需先创建管理类对象再调用
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 提交要求
|
|
|
|
|
+
|
|
|
|
|
+### 包名规范
|
|
|
|
|
+
|
|
|
|
|
+| 题目 | 包名 | 说明 |
|
|
|
|
|
+|------|------|------|
|
|
|
|
|
+| 第 7 题 | `p07_movie` | Movie 电影相关 |
|
|
|
|
|
+| 第 8 题 | `p08_guessgame` | GuessGame 猜数游戏 |
|
|
|
|
|
+| 第 9 题 | `p09_bookmanager` | BookManager 图书管理 |
|
|
|
|
|
+
|
|
|
|
|
+### 提交目录结构
|
|
|
|
|
+
|
|
|
|
|
+```
|
|
|
|
|
+提交\
|
|
|
|
|
+└─ 张三\
|
|
|
|
|
+ ├─ p07_movie\ ← 第 7 题的包
|
|
|
|
|
+ │ ├─ Movie.java ← 实体类(类名自拟)
|
|
|
|
|
+ │ └─ TestMovie.java ← 测试类(类名自拟)
|
|
|
|
|
+ ├─ p08_guessgame\ ← 第 8 题的包
|
|
|
|
|
+ │ ├─ GuessGame.java
|
|
|
|
|
+ │ └─ GuessGameTest.java
|
|
|
|
|
+ └─ p09_bookmanager\ ← 第 9 题的包
|
|
|
|
|
+ ├─ BookV2.java
|
|
|
|
|
+ ├─ BookManager.java
|
|
|
|
|
+ └─ BookManagerTest.java
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Java 源文件头部注释
|
|
|
|
|
+
|
|
|
|
|
+```java
|
|
|
|
|
+/**
|
|
|
|
|
+ * @author 你的姓名
|
|
|
|
|
+ * @title 题目X:题目名称
|
|
|
|
|
+ * @create 2026/7/21
|
|
|
|
|
+ */
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+> ⚠ **注意**:
|
|
|
|
|
+> 1. 包名必须**全小写**,与题目要求完全一致
|
|
|
|
|
+> 2. 每个包下的源文件第一行必须是 `package 包名;` 声明
|
|
|
|
|
+> 3. 文件名必须与 `public class` 的类名一致
|
|
|
|
|
+> 4. 三个题目独立完成,不要将所有类写在一个包下
|