|
|
@@ -0,0 +1,288 @@
|
|
|
+# 2026-07-20 面向对象基础练习(课堂练习用)
|
|
|
+
|
|
|
+> **说明**:以下习题涵盖今日授课内容(类与对象、封装、包)以及之前的内容(方法、数组、Random、流程控制等)。
|
|
|
+>
|
|
|
+> 题目按时间顺序排列:**随堂练习** 为课上布置的基础作业,**进阶练习** 为课后综合挑战题。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# 第一部分:随堂练习
|
|
|
+
|
|
|
+> 以下练习对应课堂代码 `Demo02.java`、`Demo03.java`、`Demo04.java` 中的注释作业。
|
|
|
+
|
|
|
+## 练习 1:教师类完整定义
|
|
|
+
|
|
|
+创建 `Teacher` 类,包含:
|
|
|
+- **属性**:教工号(`id`)、姓名(`name`)、年龄(`age`)
|
|
|
+- **方法**:授课(`teaching`)——输出 `id+name+age老师在授课`、休息(`sleep`)——输出 `id+name+age老师在休息`
|
|
|
+
|
|
|
+## 练习 2:手机类(Phone)
|
|
|
+
|
|
|
+创建 `Phone` 类和 `PhoneTest` 测试类:
|
|
|
+- **属性**:品牌(`brand`)、价格(`price`)
|
|
|
+- **方法**:打电话(`call`)、发短信(`sendMessage`)
|
|
|
+
|
|
|
+## 练习 3:矩形类(Rectangle)
|
|
|
+
|
|
|
+创建矩形类,包含:
|
|
|
+- **属性**:长度(`length`)、宽度(`width`)
|
|
|
+- **方法**:计算矩形周长、计算矩形面积
|
|
|
+
|
|
|
+## 练习 4:圆形类(Circle)
|
|
|
+
|
|
|
+创建圆形类,包含:
|
|
|
+- **属性**:PI(圆周率)、半径(`radius`)
|
|
|
+- **方法**:计算圆形周长、计算圆形面积
|
|
|
+
|
|
|
+## 练习 5:三角形类(Triangle)
|
|
|
+
|
|
|
+创建三角形类,包含:
|
|
|
+- **属性**:边A、边B、边C、高
|
|
|
+- **方法**:计算三角形周长、计算三角形面积
|
|
|
+
|
|
|
+## 练习 6:古诗场景建模
|
|
|
+
|
|
|
+分析诗句「两只黄鹂鸣翠柳,一行白鹭上青天」,创建对应类和测试类:
|
|
|
+- 黄鹂类(`HuangLi`):`sing(String s)` 方法
|
|
|
+- 白鹭类(`BaiLu`):`up(String s)` 方法
|
|
|
+- 测试类:创建 2 只黄鹂对象 + 10 只白鹭对象数组
|
|
|
+
|
|
|
+## 练习 7:交通场景建模
|
|
|
+
|
|
|
+分析描述「一辆汽车在路上行驶,一队自行车并排骑行」,创建对应类和测试类:
|
|
|
+- 汽车类(`Car`):品牌、颜色属性 + `drive()` 方法
|
|
|
+- 自行车类(`Bike`):车型属性 + `ride()` 方法
|
|
|
+- 测试类:1 个汽车对象 + 10 辆自行车对象数组
|
|
|
+
|
|
|
+## 练习 8:封装练习——学生年龄校验
|
|
|
+
|
|
|
+参照 `Person` 类的封装方式,创建一个 `StudentV2` 类:
|
|
|
+- **属性**:姓名(`name`,公开)、年龄(`age`,私有)
|
|
|
+- **要求**:通过 setter 赋值时,年龄必须在 6~35 岁之间(含边界),否则提示"年龄超出学生范围,赋值无效"
|
|
|
+- **提供** `getAge()` 方法获取年龄
|
|
|
+- **测试类**:创建对象,分别测试合法年龄和非法年龄的赋值效果
|
|
|
+
|
|
|
+## 练习 9:补全 Person 类的 name 封装
|
|
|
+
|
|
|
+在已有 `Person` 类基础上,为 `name` 属性也添加 `private` 修饰,并配置对应的 setter/getter 方法。
|
|
|
+
|
|
|
+## 练习 10:创建 Bird 类
|
|
|
+
|
|
|
+创建 `Bird` 类,定义 **3 个私有成员变量**,并对每个成员变量设置赋值和取值的方法(getter/setter),要求参数名与成员变量同名时使用 `this` 关键字。
|
|
|
+
|
|
|
+## 练习 11:创建 Product 测试类
|
|
|
+
|
|
|
+为 `Product` 类创建测试类 `ProductTest`,创建商品对象并通过 setter 赋值,通过 getter 输出所有属性值。
|
|
|
+
|
|
|
+## 练习 12:包练习——创建 com.lovecoding 包结构
|
|
|
+
|
|
|
+模仿 `p2` 包的做法,创建以下包结构并编写类:
|
|
|
+- 包名:`com.lovecoding.test`
|
|
|
+- 在该包下创建一个 `Hello` 类,包含一个 `sayHello()` 方法,输出"Hello from package!"
|
|
|
+- 创建测试类,在同包中直接调用 `Hello` 类的方法
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+# 第二部分:进阶练习
|
|
|
+
|
|
|
+> 以下为综合挑战题,融合多个知识点,难度逐步递增。
|
|
|
+
|
|
|
+## 第 1 题:类的定义与对象创建 ⭐
|
|
|
+
|
|
|
+定义一个 `Book`(图书)类,包含以下成员:
|
|
|
+- **属性**:`title`(书名,String)、`author`(作者,String)、`price`(价格,double)
|
|
|
+- **方法**:`showInfo()` —— 输出该书的所有信息
|
|
|
+
|
|
|
+在 `main` 方法中创建 3 个 `Book` 对象,分别赋值并调用 `showInfo()` 方法。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 2 题:成员变量默认值 ⭐
|
|
|
+
|
|
|
+阅读以下代码,写出运行结果:
|
|
|
+
|
|
|
+```java
|
|
|
+public class Test {
|
|
|
+ int a;
|
|
|
+ double b;
|
|
|
+ String c;
|
|
|
+ boolean d;
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Test t = new Test();
|
|
|
+ System.out.println(t.a);
|
|
|
+ System.out.println(t.b);
|
|
|
+ System.out.println(t.c);
|
|
|
+ System.out.println(t.d);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 3 题:对象引用与内存共享 ⭐⭐
|
|
|
+
|
|
|
+阅读以下代码,写出运行结果:
|
|
|
+
|
|
|
+```java
|
|
|
+public class Student {
|
|
|
+ String name;
|
|
|
+ int score;
|
|
|
+
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Student s1 = new Student();
|
|
|
+ s1.name = "小明";
|
|
|
+ s1.score = 90;
|
|
|
+
|
|
|
+ Student s2 = s1;
|
|
|
+ s2.name = "小红";
|
|
|
+ s2.score = 95;
|
|
|
+
|
|
|
+ System.out.println(s1.name + ":" + s1.score);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 4 题:封装 + 合法性校验 ⭐⭐
|
|
|
+
|
|
|
+创建一个 `BankAccount`(银行账户)类,要求:
|
|
|
+- **私有属性**:`accountNo`(账号,String)、`balance`(余额,double)
|
|
|
+- **公有方法**:
|
|
|
+ - `setBalance(double balance)` —— 如果余额小于 0,输出"余额不能为负数";否则赋值
|
|
|
+ - `getBalance()` —— 返回余额
|
|
|
+ - `deposit(double amount)` —— 存款(金额必须大于 0)
|
|
|
+ - `withdraw(double amount)` —— 取款(金额不能超过余额,且必须大于 0)
|
|
|
+
|
|
|
+在测试类中创建账户对象,测试存款和取款功能。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 5 题:方法 + 对象数组 ⭐⭐
|
|
|
+
|
|
|
+定义一个 `Student` 类(属性:学号 id、姓名 name,使用封装),再定义一个 `StudentManager` 类,包含以下方法:
|
|
|
+
|
|
|
+```java
|
|
|
+// 创建一个包含 n 个学生对象的数组,并为每个学生赋值
|
|
|
+public static Student[] createStudents(int n)
|
|
|
+
|
|
|
+// 遍历学生数组,输出所有学生信息
|
|
|
+public static void printStudents(Student[] students)
|
|
|
+```
|
|
|
+
|
|
|
+在 `main` 方法中调用上述方法,创建 5 个学生并输出。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 6 题:包 + Random + 方法综合 ⭐⭐⭐
|
|
|
+
|
|
|
+在包 `com.lovecoding.game` 下创建以下类:
|
|
|
+
|
|
|
+**`Player` 类**(实体类,封装):
|
|
|
+- 私有属性:`id`(int)、`name`(String)、`level`(int)
|
|
|
+- 提供 getter/setter
|
|
|
+
|
|
|
+**`GameDemo` 类**(业务类):
|
|
|
+- 定义一个方法 `initPlayers()`,返回包含 3 个 Player 对象的数组
|
|
|
+- 定义一个方法 `randomPlayer(Player[] players)`,随机返回数组中某个 Player 对象
|
|
|
+
|
|
|
+**`GameTest` 类**(测试类):
|
|
|
+- 调用 `initPlayers()` 获取玩家数组
|
|
|
+- 调用 `randomPlayer()` 随机抽取一名玩家,输出其信息
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 7 题:方法重用的综合计算 ⭐⭐⭐
|
|
|
+
|
|
|
+利用方法的 4 种声明方式,完成以下工具类 `MathTools`:
|
|
|
+
|
|
|
+```java
|
|
|
+// 1. 无参无返回值:输出 1~100 的所有质数
|
|
|
+public static void printPrime() {}
|
|
|
+
|
|
|
+// 2. 有参无返回值:输出 n~m 之间所有整数之和
|
|
|
+public static void printSum(int n, int m) {}
|
|
|
+
|
|
|
+// 3. 有参有返回值:判断一个数是否是回文数,返回 true/false
|
|
|
+public static boolean isPalindrome(int num) {}
|
|
|
+
|
|
|
+// 4. 无参有返回值:返回一个 1~100 之间的幸运数字(使用 Random)
|
|
|
+public static int getLuckyNumber() {}
|
|
|
+```
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 8 题:对象数组 + 排序 ⭐⭐⭐
|
|
|
+
|
|
|
+定义一个 `Score` 类(属性:`name` String、`score` int,封装),完成以下功能:
|
|
|
+
|
|
|
+1. 创建 6 个 `Score` 对象,存入数组中
|
|
|
+2. 使用 **冒泡排序**,按照 `score` 从高到低排序
|
|
|
+3. 排序后遍历数组,输出排名(第1名:xxx - xx分)
|
|
|
+
|
|
|
+> **提示**:冒泡排序时比较的是 `scores[j].getScore()` 而不是数组元素本身。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 9 题:猜数字游戏(面向对象版)⭐⭐⭐⭐
|
|
|
+
|
|
|
+将之前的猜数字游戏改造为面向对象版本,要求:
|
|
|
+
|
|
|
+**`Game` 类**:
|
|
|
+- 私有属性:`target`(目标数字)、`maxRange`(最大范围)、`attempts`(已猜次数)
|
|
|
+- 构造器:`Game(int maxRange)` —— 在 1~maxRange 之间随机生成目标数字
|
|
|
+- 方法:`guess(int num)` —— 判断猜测结果,返回 "大了/小了/猜对了!"
|
|
|
+
|
|
|
+**`GameTest` 类**:
|
|
|
+- 创建 `Game` 对象(范围 1~100)
|
|
|
+- 使用 `Scanner` 让用户循环输入猜测数字
|
|
|
+- 调用 `guess()` 方法判断,直到猜对为止,输出总共猜了多少次
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 第 10 题:综合大挑战 —— 学生成绩管理系统 ⭐⭐⭐⭐⭐
|
|
|
+
|
|
|
+在包 `com.lovecoding.system` 下创建完整的学生成绩管理系统,包含以下类:
|
|
|
+
|
|
|
+**`Student` 类**(实体类,封装):
|
|
|
+- 私有属性:`id`(int)、`name`(String)、`scores`(int[],存储三门课成绩)
|
|
|
+- getter/setter + `getAverage()` 方法返回平均分
|
|
|
+
|
|
|
+**`StudentSystem` 类**(业务类):
|
|
|
+- `initData()` —— 创建 5 个 Student 对象并返回 Student[] 数组
|
|
|
+- `printAll(Student[] students)` —— 输出所有学生信息(含平均分)
|
|
|
+- `sortByAverage(Student[] students)` —— 按平均分降序排序
|
|
|
+- `searchByName(Student[] students, String name)` —— 根据姓名查找学生并返回该学生对象(找不到返回 null)
|
|
|
+
|
|
|
+**`SystemTest` 类**(测试类):
|
|
|
+- 调用上述所有方法,展示完整功能
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+## 📋 题目总览
|
|
|
+
|
|
|
+| 序号 | 所属部分 | 核心知识点 | 难度 |
|
|
|
+|------|---------|-----------|------|
|
|
|
+| 练习 1 | 随堂 | 类定义、对象创建 | ⭐ |
|
|
|
+| 练习 2 | 随堂 | 类定义、类间关系 | ⭐ |
|
|
|
+| 练习 3 | 随堂 | 类定义、方法封装 | ⭐ |
|
|
|
+| 练习 4 | 随堂 | 类定义、π常量的使用 | ⭐ |
|
|
|
+| 练习 5 | 随堂 | 类定义、三角形属性 | ⭐ |
|
|
|
+| 练习 6 | 随堂 | 对象数组、循环创建对象 | ⭐⭐ |
|
|
|
+| 练习 7 | 随堂 | 对象数组、1对N关系建模 | ⭐⭐ |
|
|
|
+| 练习 8 | 随堂 | 封装、setter合法性校验 | ⭐⭐ |
|
|
|
+| 练习 9 | 随堂 | 封装、private + getter/setter | ⭐⭐ |
|
|
|
+| 练习 10 | 随堂 | 封装、this关键字 | ⭐⭐ |
|
|
|
+| 练习 11 | 随堂 | 封装、getter/setter使用 | ⭐⭐ |
|
|
|
+| 练习 12 | 随堂 | 包声明、同包访问 | ⭐⭐ |
|
|
|
+| 进阶 1 | 进阶 | 类定义、对象创建、方法调用 | ⭐ |
|
|
|
+| 进阶 2 | 进阶 | 成员变量默认初始化值 | ⭐ |
|
|
|
+| 进阶 3 | 进阶 | 对象引用与内存共享 | ⭐⭐ |
|
|
|
+| 进阶 4 | 进阶 | 封装、合法性校验 | ⭐⭐ |
|
|
|
+| 进阶 5 | 进阶 | 方法 + 对象数组 + 遍历 | ⭐⭐ |
|
|
|
+| 进阶 6 | 进阶 | 包、封装、Random、对象数组 | ⭐⭐⭐ |
|
|
|
+| 进阶 7 | 进阶 | 方法 4 种声明方式、质数/回文数算法 | ⭐⭐⭐ |
|
|
|
+| 进阶 8 | 进阶 | 封装 + 对象数组 + 冒泡排序 | ⭐⭐⭐ |
|
|
|
+| 进阶 9 | 进阶 | 面向对象版猜数字(封装 + Random + Scanner + 循环) | ⭐⭐⭐⭐ |
|
|
|
+| 进阶 10 | 进阶 | 综合大挑战(包 + 封装 + 对象数组 + 排序 + 查找 + 平均分) | ⭐⭐⭐⭐⭐ |
|