
日期:2026-04-02(周四)
学习目标:通过实战编码巩固Day3所学的面向对象编程核心概念,内化以下技能:
- 类设计与对象创建
- 封装原则与实践
- 继承机制与super关键字使用
- 多态实现与动态绑定
- 接口编程与抽象类应用
建议时长:3-4小时(根据个人熟练度调整)
前置知识:已完成Day3学习,熟悉类与对象、封装、继承、多态、抽象类与接口等概念。
任务一:基础任务 - 银行账户类设计
需求描述
设计一个银行账户类 BankAccount,实现以下功能:
- 封装属性 :
- 账户编号
accountId(String,私有) - 户主姓名
ownerName(String,私有) - 账户余额
balance(double,私有)
- 账户编号
- 构造方法 :
- 提供两个构造方法:无参构造(设置默认值)和全参构造(初始化所有属性)
- 公开方法 :
- 存款
deposit(double amount):增加余额,需验证金额为正数 - 取款
withdraw(double amount):减少余额,需验证金额为正数且不超过余额 - 查询余额
getBalance():返回当前余额 - 显示账户信息
displayAccountInfo():打印账户完整信息
- 存款
- 业务规则 :
- 余额不能为负数(取款时检查)
- 存款/取款金额必须大于0
类图示意(可选)
┌─────────────────────┐
│ BankAccount │
├─────────────────────┤
│ - accountId: String │
│ - ownerName: String │
│ - balance: double │
├─────────────────────┤
│ + BankAccount() │
│ + BankAccount(...) │
│ + deposit(double) │
│ + withdraw(double) │
│ + getBalance():double│
│ + displayAccountInfo()│
└─────────────────────┘
输入输出示例
=== 银行账户操作演示 ===
账户创建:张三,账号:ACC001,初始余额:1000.0
存款500.0后余额:1500.0
取款200.0后余额:1300.0
取款2000.0(失败):余额不足!
账户信息:
账户编号:ACC001
户主姓名:张三
账户余额:1300.0
验收标准
- 类定义完整,包含私有属性和公共方法
- 构造方法能正确初始化对象
- 存款、取款方法包含必要的验证逻辑
- 能正确处理边界情况(如取款金额超过余额)
- 编译运行无错误,输出符合预期
参考答案(设计思路)
- 类结构 :使用
private修饰所有属性,提供对应的getter/setter(可选) - 构造方法:无参构造可设置默认值(如空字符串和0.0),全参构造直接赋值
- 存款方法 :先验证
amount > 0,然后balance += amount - 取款方法 :验证
amount > 0 && amount <= balance,然后balance -= amount - 信息显示 :使用
System.out.println格式化输出各属性
任务二:进阶任务 - 图形继承体系
需求描述
构建一个图形(Shape)继承体系,体现面向对象三大特性:
- 抽象基类 :创建抽象类
Shape- 属性:颜色
color(String) - 构造方法:初始化颜色
- 抽象方法:
calculateArea()(计算面积)、calculatePerimeter()(计算周长) - 具体方法:
displayInfo()显示图形基本信息
- 属性:颜色
- 具体子类 :
Circle类(圆):属性半径radius(double)Rectangle类(矩形):属性长度length、宽度width(double)
- 接口扩展 :创建接口
Drawable- 抽象方法:
draw()(绘制图形) - 默认方法:
default void printDrawingInfo()输出绘制提示
- 抽象方法:
- 多态应用:编写测试类,使用父类引用操作不同子类对象
类图示意(可选)
<<抽象类>>
┌──────────┐
│ Shape │
├──────────┤
│ - color │
├──────────┤
│ + calculateArea() 抽象│
│ + calculatePerimeter()抽象│
│ + displayInfo() │
└──────────┘
↑ 继承
┌──────────┴──────────┐
│ │
┌───────┐ ┌──────────┐
│ Circle│ │ Rectangle│
├───────┤ ├──────────┤
│ -radius│ │ -length │
└───────┘ │ -width │
└──────────┘
↑ 实现
<<接口>> Drawable
├────────────┤
│ + draw() │
│ + printDrawingInfo()默认│
└────────────┘
输入输出示例
=== 图形体系测试 ===
圆形:颜色=红色,半径=5.0
面积=78.54,周长=31.42
绘制图形:绘制一个红色圆形
矩形:颜色=蓝色,长度=4.0,宽度=3.0
面积=12.0,周长=14.0
绘制图形:绘制一个蓝色矩形
验收标准
- 抽象类
Shape正确定义,包含抽象方法和具体方法 Circle和Rectangle正确继承Shape,实现所有抽象方法Drawable接口被Rectangle实现,体现接口多态- 测试类中能使用
Shape数组存储不同图形对象,循环调用面积计算 - 体现多态特性:
Shape s = new Circle(...); s.calculateArea();调用子类实现
参考答案(设计思路)
- 抽象类设计 :
Shape用abstract修饰,抽象方法用abstract修饰,无方法体 - 子类实现 :
Circle中面积公式Math.PI * radius * radius,周长2 * Math.PI * radius - 接口实现 :
Rectangle implements Drawable,实现draw()方法 - 多态数组 :
Shape[] shapes = {new Circle(...), new Rectangle(...)} - 默认方法 :接口中
default void printDrawingInfo()可直接使用
任务三:挑战任务 - 学生选课管理系统(片段)
需求描述
设计一个简化的学生选课管理系统片段,涉及多个类之间的关联关系:
- 核心类 :
Student(学生):学号、姓名、已选课程列表(使用ArrayList<Course>)Course(课程):课程编号、课程名称、学分、授课教师Teacher(教师):工号、姓名、职称
- 关联关系 :
- 学生与课程:一对多(一个学生可选多门课)
- 课程与教师:多对一(多门课可由同一教师授课)
- 功能要求 :
- 学生能选课(
addCourse(Course course)):检查是否重复选课 - 学生能退课(
removeCourse(String courseId)):根据课程编号移除 - 学生能显示已选课程信息(
displaySelectedCourses()) - 课程能显示授课教师信息(
displayTeacherInfo())
- 学生能选课(
- 集合应用 :使用
ArrayList管理课程列表,使用for-each循环遍历
类图示意(可选)
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Student │ │ Course │ │ Teacher │
├──────────┤ ├──────────┤ ├──────────┤
│ - stuId │ │ - courseId│ │ - teacherId│
│ - name │ │ - name │ │ - name │
│ - courses │─────→│ - credit │ │ - title │
│ (List<Course>)│ │ - teacher│─────→│ │
├──────────┤ ├──────────┤ └──────────┘
│ + addCourse() │ │ + displayTeacherInfo()│
│ + removeCourse()│ └──────────┘
│ + displaySelectedCourses()│
└──────────┘
输入输出示例
=== 学生选课系统 ===
学生:张三(S001)选课情况:
已选课程:
1. Java程序设计(C001,3学分,教师:李老师)
2. 数据结构(C002,4学分,教师:王老师)
退课:数据结构(C002)
剩余课程:
1. Java程序设计(C001,3学分,教师:李老师)
课程信息:
Java程序设计(C001)由李老师(副教授)授课
验收标准
- 三个类定义完整,属性私有,方法公开
- 正确使用
ArrayList<Course>作为学生类的课程列表 addCourse方法能检查重复选课(比较课程编号)removeCourse方法能根据课程编号查找并移除- 关联关系正确:
Course持有Teacher引用,Student持有Course列表 - 能创建完整对象链并测试功能
参考答案(设计思路)
- 类关联 :
Course类包含Teacher teacher属性,构造方法传入Teacher对象 - 集合管理 :
Student中private List<Course> courses = new ArrayList<>(); - 添加课程 :
addCourse中检查courses.stream().anyMatch(c -> c.getCourseId().equals(course.getCourseId())) - 移除课程 :使用迭代器或
removeIf根据课程编号删除 - 信息显示 :遍历
courses列表,调用各课程显示方法