Bläddra i källkod

docs: 新增20260721构造方法课堂练习题(随堂6题+进阶10题),更新README练习题表

WanJL 1 dag sedan
förälder
incheckning
4ecf4928db
2 ändrade filer med 351 tillägg och 0 borttagningar
  1. 1 0
      README.md
  2. 350 0
      课堂练习题/20260721-构造方法练习.md

+ 1 - 0
README.md

@@ -52,4 +52,5 @@
 | 2026-07-15 | [数组进阶练习](./课堂练习题/20260715-数组进阶练习.md) | 数组创建、遍历、排序算法 |
 | 2026-07-15 | [数组进阶练习](./课堂练习题/20260715-数组进阶练习.md) | 数组创建、遍历、排序算法 |
 | 2026-07-17 | [Java 方法基础练习](./课堂练习题/20260717-Java方法基础练习.md) | 方法 4 种声明方式、方法调用 |
 | 2026-07-17 | [Java 方法基础练习](./课堂练习题/20260717-Java方法基础练习.md) | 方法 4 种声明方式、方法调用 |
 | 2026-07-20 | [面向对象基础练习](./课堂练习题/20260720-面向对象基础练习.md) | 类与对象、封装、包、方法、数组、Random 综合
 | 2026-07-20 | [面向对象基础练习](./课堂练习题/20260720-面向对象基础练习.md) | 类与对象、封装、包、方法、数组、Random 综合
+| 2026-07-21 | [构造方法练习](./课堂练习题/20260721-构造方法练习.md) | 构造方法概念、构造方法重载、private 构造方法、this() 构造方法间调用、构造方法+对象数组+排序+Random 综合 |
 
 

+ 350 - 0
课堂练习题/20260721-构造方法练习.md

@@ -0,0 +1,350 @@
+# 2026-07-21 构造方法(构造器)基础练习(课堂练习用)
+
+> **说明**:以下习题围绕今日授课核心内容——**构造方法(构造器)** 展开,涵盖构造方法的概念、格式、重载、`private` 构造方法以及构造方法与封装的综合应用。
+>
+> 题目分为两部分:**随堂练习**(构造方法入门,6 题)和 **进阶练习**(综合挑战,10 题)。
+
+---
+
+# 第一部分:随堂练习
+
+> 以下练习围绕构造方法的基础概念和用法,每题独立可练。
+
+---
+
+## 练习 1:无参构造方法——Cat 类
+
+**难度**:⭐  
+**知识点**:类定义、无参构造方法
+
+创建一个 `Cat` 类,包含:
+- **私有属性**:`name`(String)、`age`(int)
+- **无参构造方法**:输出一条消息 `"一只小猫出生了!"`,并将 `name` 赋值为 `"小咪"`,`age` 赋值为 `1`
+- **getter/setter** 方法
+
+**测试类要求**:创建 `Cat` 对象,通过 getter 输出 name 和 age 的值。
+
+**预期输出**:
+```
+一只小猫出生了!
+name = 小咪, age = 1
+```
+
+---
+
+## 练习 2:有参构造方法——Dog 类
+
+**难度**:⭐  
+**知识点**:有参构造方法
+
+创建一个 `Dog` 类,包含:
+- **私有属性**:`name`(String)、`breed`(品种,String)
+- **有参构造方法**:`Dog(String name, String breed)` —— 通过参数为属性赋值
+- **方法**:`showInfo()` —— 输出 `"品种:xxx,名字:xxx"`
+
+**测试类要求**:使用有参构造方法创建 2 个 `Dog` 对象,分别调用 `showInfo()` 输出信息。
+
+**示例输出**:
+```
+品种:金毛,名字:旺财
+品种:哈士奇,名字:二哈
+```
+
+---
+
+## 练习 3:构造方法重载——Book 类
+
+**难度**:⭐⭐  
+**知识点**:构造方法重载
+
+创建一个 `Book` 类,包含:
+- **私有属性**:`title`(书名,String)、`author`(作者,String)、`price`(价格,double)
+- **3 个重载的构造方法**:
+  - 无参构造:书名 = `"未知"`,作者 = `"未知"`,价格 = `0.0`
+  - 双参构造:`Book(String title, String author)` —— 书名和作者由参数传入,价格默认为 `0.0`
+  - 全参构造:`Book(String title, String author, double price)` —— 所有属性由参数传入
+- **方法**:`showInfo()` 输出所有属性信息
+
+**测试类要求**:分别使用 3 种构造方法创建 3 个 Book 对象,调用 `showInfo()` 输出。
+
+**示例输出**:
+```
+书名:未知,作者:未知,价格:0.0
+书名:Java从入门到精通,作者:张三,价格:0.0
+书名:设计模式,作者:李四,价格:59.0
+```
+
+---
+
+## 练习 4:this 关键字在构造方法中应用——Phone 类
+
+**难度**:⭐⭐  
+**知识点**:构造方法 + this 关键字
+
+创建一个 `Phone` 类,包含:
+- **私有属性**:`brand`(品牌,String)、`price`(价格,double)、`color`(颜色,String)
+- **构造方法**:全参构造 `Phone(String brand, double price, String color)` —— 使用 `this` 关键字区分同名参数
+- **方法**:`call(String name)` —— 输出 `"品牌xxx的手机正在给yyy打电话"`
+
+**测试类要求**:使用全参构造创建对象,调用 `call()` 方法。
+
+**示例输出**:
+```
+品牌华为的手机正在给张三打电话
+```
+
+---
+
+## 练习 5:private 构造方法——Singleton 体验
+
+**难度**:⭐⭐⭐  
+**知识点**:private 构造方法
+
+创建一个 `Manager` 类,包含:
+- **私有属性**:`name`(String)
+- **私有构造方法**:`private Manager()` —— 构造方法内部输出 `"Manager 对象已创建"`
+- **公有** `static` 方法:`public static Manager getInstance()` —— 内部 `new Manager()` 并返回该对象
+- **getter/setter**
+
+**测试类要求**:
+1. 尝试直接 `new Manager()`,观察编译错误
+2. 通过 `Manager.getInstance()` 方法获取 Manager 对象,设置 name 并输出
+
+**提示**:这是单例设计模式的雏形——通过私有构造方法 + 静态方法控制对象的创建。
+
+---
+
+## 练习 6:默认构造方法 vs 显式定义
+
+**难度**:⭐⭐  
+**知识点**:默认构造方法被覆盖
+
+创建一个 `StudentV3` 类,包含:
+- **私有属性**:`name`(String)、`score`(int)
+- **定义一个 2 参构造方法**:`StudentV3(String name, int score)`
+- **注意**:不要定义无参构造方法
+
+**测试类要求**:
+1. 尝试 `new StudentV3()` —— 观察编译是否报错(因为显式定义了构造方法,默认无参构造被覆盖)
+2. 使用 `new StudentV3("小明", 90)` 创建对象,通过 getter 输出信息
+
+**思考**:为什么 `new StudentV3()` 会报错?
+
+---
+
+# 第二部分:进阶练习
+
+> 以下为综合挑战题,融合构造方法与封装、对象数组、Random、方法等知识点,难度逐步递增。
+
+---
+
+## 第 1 题:构造方法 + 封装——Computer 类 ⭐
+
+创建一个 `Computer` 类,包含:
+- **私有属性**:`brand`(品牌)、`cpu`(CPU 型号)、`memory`(内存大小,int,单位 GB)、`price`(价格)
+- **无参构造方法**:品牌 = `"未知品牌"`,CPU = `"未知CPU"`,内存 = `8`,价格 = `3999.0`
+- **全参构造方法**:所有属性通过参数传入
+- **getter/setter**
+- **方法**:`showConfig()` 输出电脑配置信息
+
+**测试类要求**:分别使用无参构造和全参构造创建两个 Computer 对象,调用 `showConfig()` 输出。
+
+---
+
+## 第 2 题:构造方法 + 对象数组——创建多个对象 ⭐⭐
+
+定义一个 `Hero`(英雄)类,包含:
+- **私有属性**:`name`(英雄名)、`hp`(血量,int)、`attack`(攻击力,int)
+- **全参构造方法**:`Hero(String name, int hp, int attack)`
+- **getter/setter**
+- **方法**:`showInfo()` 输出英雄信息
+
+**测试类要求**:
+1. 创建 5 个 `Hero` 对象(数据自拟:如"盖伦" 580 100、"剑圣" 450 130 等)
+2. 存入 `Hero[]` 数组
+3. 遍历数组,调用每个英雄的 `showInfo()` 方法
+
+---
+
+## 第 3 题:构造方法 + setter 校验——BankAccount 类 ⭐⭐
+
+创建一个 `BankAccount` 类,包含:
+- **私有属性**:`accountNo`(账号,String)、`owner`(户主,String)、`balance`(余额,double)
+- **全参构造方法**:`BankAccount(String accountNo, String owner, double balance)`
+- 在构造方法中加入校验:如果 `balance` 小于 0,则输出 `"初始余额不能为负数,已设置为0.0"`,并将余额强制设为 `0.0`
+- **getter/setter**(setBalance 也要有同样的校验)
+- **方法**:`deposit(double amount)` 存款(金额必须大于0),`withdraw(double amount)` 取款(不能透支)
+
+**测试类要求**:
+1. 使用全参构造创建一个余额为负数的账户,观察构造方法中的校验输出
+2. 测试存款、取款功能
+
+---
+
+## 第 4 题:构造方法重载 + 默认值——Employee 类 ⭐⭐
+
+创建一个 `Employee` 类,包含:
+- **私有属性**:`id`(工号)、`name`(姓名)、`position`(职位)、`salary`(薪资)
+- **3 个重载的构造方法**:
+  - 全参构造
+  - `Employee(String id, String name, String position)` —— 薪资默认为 `5000.0`
+  - `Employee(String id, String name)` —— 职位默认 `"普通员工"`,薪资默认 `3500.0`
+- **方法**:`work()` 输出 `"工号xxx的员工xxx正在工作,职位:xxx,薪资:xxx"`
+
+**测试类要求**:使用 3 种构造方法分别创建对象,调用 `work()` 方法。
+
+---
+
+## 第 5 题:构造方法 + 方法调用——Circle ⭐⭐
+
+创建一个 `Circle` 类,包含:
+- **私有属性**:`radius`(半径,double)
+- **构造方法**:
+  - 无参构造:半径 = `1.0`
+  - 有参构造:`Circle(double radius)`
+- **setter** 中校验半径必须大于 0,否则提示 `"半径必须大于0"`
+- **方法**:
+  - `getArea()` 返回面积(π × r²)
+  - `getPerimeter()` 返回周长(2 × π × r)
+
+**测试类要求**:创建两个 Circle 对象(一个无参,一个有参),分别输出面积和周长。
+
+> **提示**:π 取 `3.1415926`,面积和周长的返回值为 `double` 类型。
+
+---
+
+## 第 6 题:构造方法 + this() 调用——Student 类 ⭐⭐⭐
+
+> **注意**:`this(参数)` 在一个构造方法中调用另一个构造方法,必须写在构造方法的第一行。
+
+创建一个 `StudentV4` 类,包含:
+- **私有属性**:`id`(学号,int)、`name`(姓名,String)、`className`(班级,String)
+- **构造方法**(使用 `this()` 互相调用):
+  - 无参构造:调用全参构造,传入 `0, "未知", "未分配"`
+  - `StudentV4(int id, String name)`:调用全参构造,传入 `id, name, "默认班"`
+  - `StudentV4(int id, String name, String className)`:直接为属性赋值
+- **方法**:`showInfo()` 输出所有信息
+
+**测试类要求**:分别使用 3 种构造方法创建对象,输出验证。
+
+**示例输出**:
+```
+学号:0,姓名:未知,班级:未分配
+学号:1001,姓名:张三,班级:默认班
+学号:1002,姓名:李四,班级:J260713
+```
+
+---
+
+## 第 7 题:构造方法 + 对象数组 + 遍历打印——Movie 类 ⭐⭐⭐
+
+创建一个 `Movie`(电影)类,包含:
+- **私有属性**:`title`(片名)、`director`(导演)、`year`(上映年份,int)、`rating`(评分,double)
+- **全参构造方法**
+- **getter/setter**
+- **方法**:`showInfo()` 输出电影信息
+
+**测试类要求**:
+1. 创建一个 `Movie[]` 数组,存储至少 4 部电影
+2. 使用 **全参构造方法一次性初始化** 所有电影对象(不要用无参构造 + setter)
+3. 遍历数组,输出评分最高的电影信息
+
+**示例数据**:
+```
+"肖申克的救赎", "弗兰克·德拉邦特", 1994, 9.7
+"霸王别姬", "陈凯歌", 1993, 9.6
+"阿甘正传", "罗伯特·泽米吉斯", 1994, 9.5
+"泰坦尼克号", "詹姆斯·卡梅隆", 1997, 9.4
+```
+
+---
+
+## 第 8 题:构造方法 + Random + 方法——猜数游戏(面向对象版)⭐⭐⭐⭐
+
+将猜数字游戏改造为面向对象版本,使用构造方法初始化游戏:
+
+**`GuessGame` 类**:
+- **私有属性**:`target`(目标数字,int)、`maxRange`(最大范围,int)、`attempts`(已猜次数,int)
+- **构造方法**:`GuessGame(int maxRange)` —— 在 `1 ~ maxRange` 之间用 Random 生成目标数字
+- **方法**:
+  - `guess(int num)` —— 判断猜测结果,返回 `String`:`"猜对了!"` / `"大了,再小点"` / `"小了,再大点"`
+  - `getAttempts()` —— 返回已猜次数
+
+**`GuessGameTest` 测试类**:
+1. 创建 `GuessGame` 对象,范围 1~100
+2. 使用 `Scanner` 让用户循环输入猜测数字
+3. 调用 `guess()` 方法判断,直到猜对为止
+4. 猜对后输出总共猜了多少次
+
+---
+
+## 第 9 题:构造方法 + 封装 + 对象数组 + 排序——BookManager ⭐⭐⭐⭐
+
+创建一个 `BookV2` 类:
+- **私有属性**:`id`(编号,int)、`title`(书名)、`price`(价格,double)
+- **全参构造方法**
+- **getter/setter**
+
+创建一个 `BookManager` 类,包含以下方法:
+- `initBooks()` —— 创建并返回一个包含 5 本图书的 `BookV2[]` 数组(使用全参构造初始化)
+- `printBooks(BookV2[] books)` —— 遍历输出所有图书信息
+- `sortByPrice(BookV2[] books)` —— 按价格从高到低排序(冒泡排序)
+- `searchByTitle(BookV2[] books, String title)` —— 根据书名查找图书,返回找到的图书对象(找不到返回 `null`)
+
+**`BookManagerTest` 测试类**:
+1. 调用 `initBooks()` 初始化图书数组
+2. 调用 `printBooks()` 输出原始顺序
+3. 调用 `sortByPrice()` 排序后再次输出
+4. 调用 `searchByTitle()` 查找某本书,输出查找结果
+
+---
+
+## 第 10 题:综合大挑战——学生成绩管理系统(构造方法版)⭐⭐⭐⭐⭐
+
+使用构造方法完成完整的学生成绩管理系统,在包 `system` 下创建以下类:
+
+**`StudentV5` 类**(实体类):
+- **私有属性**:`id`(学号,int)、`name`(姓名,String)、`javaScore`(Java 成绩,double)、`mysqlScore`(MySQL 成绩,double)
+- **全参构造方法**
+- **getter/setter**
+- **方法**:`getAverage()` 返回两门课的平均分
+
+**`StudentSystem` 类**(业务类):
+- **私有属性**:`StudentV5[] students`(学生数组)、`count`(当前学生数量)
+- **构造方法**:`StudentSystem(int capacity)` —— 初始化指定容量的学生数组
+- **方法**:
+  - `addStudent(StudentV5 s)` —— 将学生添加到数组中(如果数组已满,提示"数组已满,添加失败")
+  - `printAll()` —— 输出所有学生信息(含平均分)
+  - `sortByAverage()` —— 按平均分降序排序(冒泡排序)
+  - `getTopStudent()` —— 返回平均分最高的学生对象
+
+**`SystemTest` 类**(测试类):
+1. 创建 `StudentSystem` 对象,容量为 5
+2. 使用全参构造创建 5 个学生对象
+3. 调用 `addStudent()` 逐个添加学生
+4. 调用 `printAll()` 输出所有学生信息
+5. 调用 `sortByAverage()` 排序后再次输出
+6. 调用 `getTopStudent()` 输出最高分学生信息
+
+---
+
+## 📋 题目总览
+
+| 序号 | 所属部分 | 核心知识点 | 难度 |
+|------|---------|-----------|------|
+| 练习 1 | 随堂 | 无参构造方法、对象创建 | ⭐ |
+| 练习 2 | 随堂 | 有参构造方法、属性初始化 | ⭐ |
+| 练习 3 | 随堂 | 构造方法重载(3 种形式) | ⭐⭐ |
+| 练习 4 | 随堂 | 构造方法 + this 关键字 | ⭐⭐ |
+| 练习 5 | 随堂 | private 构造方法、单例模式雏形 | ⭐⭐⭐ |
+| 练习 6 | 随堂 | 默认构造方法被覆盖 | ⭐⭐ |
+| 进阶 1 | 进阶 | 无参/全参构造方法、封装 | ⭐ |
+| 进阶 2 | 进阶 | 全参构造 + 对象数组 + 遍历 | ⭐⭐ |
+| 进阶 3 | 进阶 | 构造方法中参数校验、封装 | ⭐⭐ |
+| 进阶 4 | 进阶 | 构造方法重载 + 默认值 | ⭐⭐ |
+| 进阶 5 | 进阶 | 构造方法 + 方法封装 + 校验 | ⭐⭐ |
+| 进阶 6 | 进阶 | this() 构造方法间调用 | ⭐⭐⭐ |
+| 进阶 7 | 进阶 | 全参构造 + 对象数组 + 遍历查找 | ⭐⭐⭐ |
+| 进阶 8 | 进阶 | 构造方法 + Random + Scanner + 循环 | ⭐⭐⭐⭐ |
+| 进阶 9 | 进阶 | 构造方法 + 封装 + 对象数组 + 排序 + 查找 | ⭐⭐⭐⭐ |
+| 进阶 10 | 进阶 | 综合大挑战(构造方法 + 封装 + 包 + 对象数组 + 排序 + 平均分) | ⭐⭐⭐⭐⭐ |