2026年7月21日-作业.md 8.9 KB

2026-07-21 JavaSE 课后作业

课程内容:构造方法(构造器)—— 无参构造、有参构造、构造方法重载、this() 调用、封装综合应用

涉及前序知识:封装、对象数组、Random、Scanner、冒泡排序、数组遍历

提交方式:在 提交\姓名\ 目录下创建对应的 Java 源文件

截止时间:下次上课前


📌 本次作业重要说明

命名要求变更

与以往作业不同,本次作业不再要求类名按指定格式命名,而是要求包名按指定格式命名。

变化 之前的要求 本次的要求
类名 必须按 Demo_XX_姓名 格式命名 自由命名(见下文要求)
包名 不要求(默认包) 必须按指定包名创建
文件名 必须与类名一致 与类名一致即可

具体要求

  1. 每个题目对应一个独立的包,包名在题目中已指定
  2. 每个包下包含该题所需的所有类(实体类 + 测试类)
  3. 类名自由命名,但需见名知意(如实体类用 Movie、GuessGame、BookV2 等均可)
  4. 测试类建议命名为 TestXxx 或 XxxTest(如 TestMovie、GuessGameTest)
  5. 每个 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() 查找某本书,输出查找结果

示例数据:

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 源文件头部注释

/**
 * @author 你的姓名
 * @title 题目X:题目名称
 * @create 2026/7/21
 */

⚠ 注意:

  1. 包名必须全小写,与题目要求完全一致
  2. 每个包下的源文件第一行必须是 package 包名; 声明
  3. 文件名必须与 public class 的类名一致
  4. 三个题目独立完成,不要将所有类写在一个包下