跟着AI学java第4天:面向对象编程巩固

日期:2026-04-02(周四)

学习目标:通过实战编码巩固Day3所学的面向对象编程核心概念,内化以下技能:

  1. 类设计与对象创建
  2. 封装原则与实践
  3. 继承机制与super关键字使用
  4. 多态实现与动态绑定
  5. 接口编程与抽象类应用

建议时长:3-4小时(根据个人熟练度调整)

前置知识:已完成Day3学习,熟悉类与对象、封装、继承、多态、抽象类与接口等概念。

任务一:基础任务 - 银行账户类设计

需求描述

设计一个银行账户类 BankAccount,实现以下功能:

  1. 封装属性
    • 账户编号 accountId(String,私有)
    • 户主姓名 ownerName(String,私有)
    • 账户余额 balance(double,私有)
  2. 构造方法
    • 提供两个构造方法:无参构造(设置默认值)和全参构造(初始化所有属性)
  3. 公开方法
    • 存款 deposit(double amount):增加余额,需验证金额为正数
    • 取款 withdraw(double amount):减少余额,需验证金额为正数且不超过余额
    • 查询余额 getBalance():返回当前余额
    • 显示账户信息 displayAccountInfo():打印账户完整信息
  4. 业务规则
    • 余额不能为负数(取款时检查)
    • 存款/取款金额必须大于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

验收标准

  1. 类定义完整,包含私有属性和公共方法
  2. 构造方法能正确初始化对象
  3. 存款、取款方法包含必要的验证逻辑
  4. 能正确处理边界情况(如取款金额超过余额)
  5. 编译运行无错误,输出符合预期

参考答案(设计思路)

  1. 类结构 :使用private修饰所有属性,提供对应的getter/setter(可选)
  2. 构造方法:无参构造可设置默认值(如空字符串和0.0),全参构造直接赋值
  3. 存款方法 :先验证amount > 0,然后balance += amount
  4. 取款方法 :验证amount > 0 && amount <= balance,然后balance -= amount
  5. 信息显示 :使用System.out.println格式化输出各属性

任务二:进阶任务 - 图形继承体系

需求描述

构建一个图形(Shape)继承体系,体现面向对象三大特性:

  1. 抽象基类 :创建抽象类 Shape
    • 属性:颜色 color(String)
    • 构造方法:初始化颜色
    • 抽象方法:calculateArea()(计算面积)、calculatePerimeter()(计算周长)
    • 具体方法:displayInfo() 显示图形基本信息
  2. 具体子类
    • Circle 类(圆):属性半径 radius(double)
    • Rectangle 类(矩形):属性长度 length、宽度 width(double)
  3. 接口扩展 :创建接口 Drawable
    • 抽象方法:draw()(绘制图形)
    • 默认方法:default void printDrawingInfo() 输出绘制提示
  4. 多态应用:编写测试类,使用父类引用操作不同子类对象

类图示意(可选)

复制代码
            <<抽象类>>
           ┌──────────┐
           │  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
绘制图形:绘制一个蓝色矩形

验收标准

  1. 抽象类Shape正确定义,包含抽象方法和具体方法
  2. CircleRectangle正确继承Shape,实现所有抽象方法
  3. Drawable接口被Rectangle实现,体现接口多态
  4. 测试类中能使用Shape数组存储不同图形对象,循环调用面积计算
  5. 体现多态特性:Shape s = new Circle(...); s.calculateArea(); 调用子类实现

参考答案(设计思路)

  1. 抽象类设计Shapeabstract修饰,抽象方法用abstract修饰,无方法体
  2. 子类实现Circle中面积公式Math.PI * radius * radius,周长2 * Math.PI * radius
  3. 接口实现Rectangle implements Drawable,实现draw()方法
  4. 多态数组Shape[] shapes = {new Circle(...), new Rectangle(...)}
  5. 默认方法 :接口中default void printDrawingInfo()可直接使用

任务三:挑战任务 - 学生选课管理系统(片段)

需求描述

设计一个简化的学生选课管理系统片段,涉及多个类之间的关联关系:

  1. 核心类
    • Student(学生):学号、姓名、已选课程列表(使用ArrayList<Course>
    • Course(课程):课程编号、课程名称、学分、授课教师
    • Teacher(教师):工号、姓名、职称
  2. 关联关系
    • 学生与课程:一对多(一个学生可选多门课)
    • 课程与教师:多对一(多门课可由同一教师授课)
  3. 功能要求
    • 学生能选课(addCourse(Course course)):检查是否重复选课
    • 学生能退课(removeCourse(String courseId)):根据课程编号移除
    • 学生能显示已选课程信息(displaySelectedCourses()
    • 课程能显示授课教师信息(displayTeacherInfo()
  4. 集合应用 :使用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)由李老师(副教授)授课

验收标准

  1. 三个类定义完整,属性私有,方法公开
  2. 正确使用ArrayList<Course>作为学生类的课程列表
  3. addCourse方法能检查重复选课(比较课程编号)
  4. removeCourse方法能根据课程编号查找并移除
  5. 关联关系正确:Course持有Teacher引用,Student持有Course列表
  6. 能创建完整对象链并测试功能

参考答案(设计思路)

  1. 类关联Course类包含Teacher teacher属性,构造方法传入Teacher对象
  2. 集合管理Studentprivate List<Course> courses = new ArrayList<>();
  3. 添加课程addCourse中检查courses.stream().anyMatch(c -> c.getCourseId().equals(course.getCourseId()))
  4. 移除课程 :使用迭代器或removeIf根据课程编号删除
  5. 信息显示 :遍历courses列表,调用各课程显示方法
相关推荐
TechubNews5 分钟前
专访新火集团首席经济学家付鹏:解读比特币资产属性、香港楼市与普通人理财建议——Techub News对话实录
人工智能·区块链
Wang15309 分钟前
Java排序
java
逸风尊者14 分钟前
XGBoost模型工程使用
java·后端·算法
一嘴一个橘子14 分钟前
MP 自定义业务方法 (二)
java
Liiiks15 分钟前
GPT-Image-2来了!实测:文字渲染99%,UI截图像素级还原,前端工作流要变天了
人工智能·gpt·chatgpt·大模型·ai生图·gpt-image-2·图片设计
无巧不成书021815 分钟前
2026最新Next-AI-Draw-io全攻略:AI驱动专业图表生成,Docker/Node.js本地部署零踩坑指南
人工智能·docker·node.js·next-ai-draw-io
lhbian26 分钟前
AI编程革命:Codex让脚本开发提速10倍
开发语言·汇编·jvm·c#
jiayong2327 分钟前
第 36 课:任务详情抽屉快捷改状态
开发语言·前端·javascript·vue.js·学习
少许极端28 分钟前
AI修炼记1-Tool Calling
人工智能·ai·spring ai·tool calling
低客的黑调31 分钟前
MyBatis-Plus-从 CRUD 到高级特性
java·servlet·tomcat