跟着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. Circle和Rectangle正确继承Shape,实现所有抽象方法
  3. Drawable接口被Rectangle实现,体现接口多态
  4. 测试类中能使用Shape数组存储不同图形对象,循环调用面积计算
  5. 体现多态特性:Shape s = new Circle(...); s.calculateArea(); 调用子类实现

参考答案(设计思路)

  1. 抽象类设计 :Shape用abstract修饰,抽象方法用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. 集合管理 :Student中private List<Course> courses = new ArrayList<>();
  3. 添加课程 :addCourse中检查courses.stream().anyMatch(c -> c.getCourseId().equals(course.getCourseId()))
  4. 移除课程 :使用迭代器或removeIf根据课程编号删除
  5. 信息显示 :遍历courses列表,调用各课程显示方法
相关推荐
陈 洪 伟几秒前
Transformer彻底剖析(9):归一化演进——BatchNorm、LayerNorm、RMSNorm、Post-LN / Pre-LN、DeepNorm
人工智能·深度学习·transformer
Kari112 分钟前
AI 手写 OCR 在教育场景的工程化:为什么准确率从 82% 做到 99% 这么难
人工智能·深度学习·机器学习
数聚天成DeepSData4 分钟前
两批标注数据合并前要核对什么
人工智能·深度学习·机器学习·数据集·deepsdata
正经教主13 分钟前
【FDE系列】阶段3:Day 77:LangChain 基础 — LCEL 管道与三件套
人工智能·langchain·agent·fde
AI办公探索者28 分钟前
从“岗位为中心”到“任务为中心”:企业级Agent Hub的架构演进
人工智能·架构
fly-iot38 分钟前
【下一个 AI 方向】:中小企业的数字化建设,物联网解决方案思考,使用开源项目快速搭建降低成本。
人工智能·物联网
金銀銅鐵42 分钟前
[Java] 展示增删元素时 LinkedList 的内部变化
java·后端·ai编程
卡卡~~42 分钟前
“101计划”核心课程实践教材《数据实验结构指导-C++语言版》题目集
开发语言·c++·学习·算法
方芯半导体1 小时前
2026工业机器人控制芯片赛道:竞争格局与关键选型指标深度解析
大数据·人工智能·机器人
科创致远1 小时前
科创致远 ESOP 赋能车间图纸全维管理实战
大数据·人工智能·制造·精益工程