20260721-构造方法练习.md 14 KB

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