# 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. 三个题目独立完成,不要将所有类写在一个包下