20260720-面向对象基础练习.md 10 KB

2026-07-20 面向对象基础练习(课堂练习用)

说明:以下习题涵盖今日授课内容(类与对象、封装、包)以及之前的内容(方法、数组、Random、流程控制等)。

题目按时间顺序排列:随堂练习 为课上布置的基础作业,进阶练习 为课后综合挑战题。


第一部分:随堂练习

以下练习对应课堂代码 Demo02.javaDemo03.javaDemo04.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 题:成员变量默认值 ⭐

阅读以下代码,写出运行结果:

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 题:对象引用与内存共享 ⭐⭐

阅读以下代码,写出运行结果:

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 类,包含以下方法:

// 创建一个包含 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

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