跟着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列表,调用各课程显示方法
相关推荐
lThE ANDE2 小时前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
聆风吟º2 小时前
【C标准库】深入理解C语言memcmp函数:内存比较的利器
c语言·开发语言·库函数·memcmp
Treh UNFO2 小时前
Spring Boot环境配置
java·spring boot·后端
咕噜签名-铁蛋2 小时前
OpenClaw 中转 API:打造安全高效的 AI 智能体调用方案
大数据·人工智能·安全
NaMM CHIN2 小时前
Spring boot整合quartz方法
java·前端·spring boot
QYR-分析2 小时前
2026车载同轴电缆行业全景分析:产品、市场与发展机遇
大数据·人工智能
艾莉丝努力练剑2 小时前
【Linux线程】Linux系统多线程(一):线程概念
java·linux·运维·服务器·开发语言·学习·线程
爱看科技2 小时前
Meta「Ray-Ban AI」眼镜登场,谷歌/微美全息AI+AR智能眼镜市场表现火热
人工智能·ar
低保和光头哪个先来2 小时前
Axios 近期安全版本
开发语言·前端·javascript·前端框架