课程内容:构造方法(构造器)—— 无参构造、有参构造、构造方法重载、this() 调用、封装综合应用
涉及前序知识:封装、对象数组、Random、Scanner、冒泡排序、数组遍历
提交方式:在
提交\姓名\目录下创建对应的 Java 源文件截止时间:下次上课前
与以往作业不同,本次作业不再要求类名按指定格式命名,而是要求包名按指定格式命名。
| 变化 | 之前的要求 | 本次的要求 |
|---|---|---|
| 类名 | 必须按 Demo_XX_姓名 格式命名 |
自由命名(见下文要求) |
| 包名 | 不要求(默认包) | 必须按指定包名创建 |
| 文件名 | 必须与类名一致 | 与类名一致即可 |
Movie、GuessGame、BookV2 等均可)TestXxx 或 XxxTest(如 TestMovie、GuessGameTest)每个 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
⚠ 注意:包名必须严格按题目要求书写(全小写),目录结构必须与包结构一致。
包名:p07_movie
创建一个电影类(类名自拟),包含:
title(片名)、director(导演)、year(上映年份,int)、rating(评分,double)showInfo() 输出电影信息测试类要求(测试类类名自拟,置于 p07_movie 包下):
示例数据:
"肖申克的救赎", "弗兰克·德拉邦特", 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
💡 提示:找评分最高的电影 → 遍历数组,用变量记录最大值及其下标或对象引用。
包名: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 包下)Scanner 让用户循环输入猜测数字guess() 方法判断,直到猜对为止示例运行效果:
======= 猜数游戏(1~100) =======
请输入你猜的数字:50
小了,再大点
请输入你猜的数字:75
大了,再小点
请输入你猜的数字:62
小了,再大点
请输入你猜的数字:68
猜对了!
恭喜你!一共猜了 4 次
💡 提示:
- 构造方法中使用
Random的nextInt(maxRange) + 1生成 1~maxRange 的随机数guess()方法中每次调用时attempts自增 1- 测试类中使用
while(true)循环,猜对时break
包名:p09_bookmanager
p09_bookmanager 包下)id(编号,int)、title(书名,String)、price(价格,double)p09_bookmanager 包下)包含以下方法:
| 方法 | 说明 |
|---|---|
initBooks() |
创建并返回一个包含 5 本图书 的数组(使用全参构造初始化) |
printBooks(图书数组类型 books) |
遍历输出所有图书信息 |
sortByPrice(图书数组类型 books) |
按价格从高到低排序(冒泡排序) |
searchByTitle(图书数组类型 books, String title) |
根据书名查找图书,返回找到的图书对象(找不到返回 null) |
p09_bookmanager 包下)initBooks() 初始化图书数组printBooks() 输出原始顺序sortByPrice() 排序后再次输出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
/**
* @author 你的姓名
* @title 题目X:题目名称
* @create 2026/7/21
*/
⚠ 注意:
- 包名必须全小写,与题目要求完全一致
- 每个包下的源文件第一行必须是
package 包名;声明- 文件名必须与
public class的类名一致- 三个题目独立完成,不要将所有类写在一个包下