# 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 | 进阶 | 综合大挑战(包 + 封装 + 对象数组 + 排序 + 查找 + 平均分) | ⭐⭐⭐⭐⭐ |