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