Object-Oriented Programming 课程总结
🌟 OOP 第三次大作业之课程总结
回顾这一学期的 Java 面向对象课程学习,仿佛一场充满挑战与惊喜的冒险,每一个学习环节都像沿途的风景,深深印刻在我的脑海中。
🚀 (一)前言:跌跌撞撞的学习之路
Blog 作业:从空白文档到知识梳理
起初是个 "甜蜜的负担"
每次面对空白文档都绞尽脑汁:既想梳理知识,又渴望表达独特见解。还记得第一次写Blog时,对着屏幕发呆许久才憋出寥寥数语。但随着不断尝试,慢慢找到了节奏,每次写完一篇,看着知识理解从模糊到清晰,成就感便油然而生。
PTA 作业:编程闯关之旅
先苦后甜的成长体验
刚开始觉得特别难,尤其是那道电梯题目,耗费了特别久的时间。但后面的PTA作业逐渐适应,越来越得心应手。因为我觉得课程组关注的不是题目难度,而是掌握面向对象的设计原则和思想。
实验作业:从理论到实践
"实战演练场"的奇妙体验
从把大象装进冰箱的生动例子,到使用JavaFX实现GUI界面,虽然难度不高,却让我真正体会到将代码变成实际应用的乐趣。
线上课程:学习的预热
面向对象学习过程的预热
在我们第一次了解到面向对象技术的就是从线上课程,从集合框架,到面向对象设计原则,再到十分高效的正则表达式,虽然说一开始看的是会觉得比较枯燥,但是对于之后真的有很大的用处。
线下课程:核心的学习
学习真本领的地方
在线下课程中,老师重点给我们讲了面向对象的设计思想,而不是基础语法,这让我明白这种思想的重要性,也让我明白了在解决一到题目之前要多想
🚀 (二)面向对象技术总结:从懵懂到成长
🧩 (1)核心三剑客:封装、继承与多态 基础
1. 封装:数据的守护者
实践感悟:在航空货物系统开发中,通过封装:
- 数据验证:在
Cargo类中通过setWeight(double weight)方法校验重量,若输入负值则抛出异常,确保货物数据合法性;- 操作审计:封装
setStatus(String status)方法时,自动记录状态变更日志(如“2025-06-18 货物已加入”),便于追溯操作轨迹;- 安全隔离:将
calculateShippingFee()计费算法设为私有方法,外部仅能通过getTotalFee()获取结果,防止核心逻辑被篡改;- 业务抽象:封装
CargoType枚举类管理货物类型(普通/危险品/加急),通过getHandlingRules()方法暴露对应处理规则,隐藏底层实现细节。
2. 继承:代码复用的艺术
// 几何图形继承体系
public abstract class Shape {
public abstract double calculateArea();
}
public class Circle extends Shape {
@Override
public double calculateArea() { /* 实现 */ }
}
重构经验:在上面代码中,过度继承可能导致:
- 新增三角形类时代码冗余
- 方法重写混乱
解决方案:采用浅继承+组合模式
3. 多态:灵活性的源泉
// 支付系统多态实现
public interface PaymentMethod {
void processPayment(double amount);
}
public class PaymentProcessor {
public void executePayment(PaymentMethod method) {
method.processPayment(); // 多态调用
}
}
突破时刻:在航空货物管理系统中,用多态替代
switch-case:
- 新增支付方式无需修改处理器
- 实现了解耦和扩展性
🧠 (2)抽象类与接口:架构的艺术
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 核心区别 | "是什么"的抽象 | "能做什么"的契约 |
| 继承 | 单继承 | 多实现 |
| 典型场景 | 模板方法模式 | 策略模式/适配器模式 |
血泪教训:在航空货物管理系统中:
- 错误使用接口导致重复实现
- 无法封装公共状态
重构方案:抽象类提供骨架实现 + 钩子方法
🧰 (3)技术工具箱深度探索
1. 集合框架:数据管理的利器 好用
| 分类 | 接口/类 | 特点 | 典型应用场景 |
|---|---|---|---|
Collection体系 |
List(有序可重复) |
元素有顺序,可存储重复值 | 学生名单、任务列表 |
ArrayList |
数组实现,随机访问效率高 | 频繁查询数据 | |
LinkedList |
链表实现,增删操作效率高 | 消息队列、频繁插入删除场景 | |
Set(无序不可重复) |
元素无顺序,自动去重 | 数据去重、唯一值校验 | |
HashSet |
基于哈希表,查询性能最优 | 快速判断元素是否存在 | |
TreeSet |
可按自然顺序或自定义排序 | 成绩排名、有序数据展示 | |
Map体系 |
Map(键值对存储) |
key唯一,通过key快速查找value | 字典、配置项存储 |
HashMap |
哈希表实现,查询/插入效率高 | 缓存、用户信息存储 | |
TreeMap |
按key排序,支持范围查询 | 按时间排序的日志数据 |
集合框架是Java中处理数据的核心工具,通过接口与实现类的分离设计,让开发者能根据场景选择最优数据结构。学习时需重点掌握:
List、Set、Map三大体系的区别:List适合有序重复数据,Set用于去重,Map则解决键值对快速查询问题;- 实现类特性:如
ArrayList的数组底层适合查询,LinkedList的链表结构适合增删,HashMap的哈希表实现让查询效率达O(1);- 应用场景:比如用
TreeSet做成绩排序,HashMap实现用户缓存,LinkedList处理消息队列等。掌握集合框架就像拥有“数据容器工具箱”,能根据需求快速选取合适工具,让代码效率与可读性同步提升。
2. 异常处理:系统的安全网 项目开发必备
| 分类 | 概念/类 | 特点 | 典型应用场景 | 处理方式示例 |
|---|---|---|---|---|
| 异常体系 | Throwable |
所有异常和错误的父类 | - | - |
Exception |
程序可处理的异常,分为受检查异常(Checked)和非受检查异常(Unchecked) |
- | - | |
RuntimeException |
非受检查异常(无需强制处理),如NullPointerException、ArrayIndexOutOfBoundsException |
程序逻辑错误导致的异常 | 使用try-catch捕获或让调用者处理 | |
Error |
系统级错误,如OutOfMemoryError、StackOverflowError |
程序无法处理,通常由JVM抛出 | 优化代码或增加资源(如扩大内存) | |
| 处理机制 | try-catch-finally |
捕获并处理异常 | 读取文件、网络请求等可能出错的操作 | 用try包裹可能出错的代码,catch捕获特定异常并处理,finally用于释放资源(如关闭文件) |
throws |
声明方法可能抛出的异常,由调用者处理 | 方法内部无法完全处理异常时 | 在方法签名中使用throws声明异常类型,由调用该方法的代码负责处理异常 | |
throw |
手动抛出异常 | 自定义业务异常 | 根据业务逻辑条件,使用throw手动抛出异常对象(如参数校验不通过时) |
|
| 自定义异常 | 继承Exception类 |
创建符合业务需求的异常类 | 业务规则校验(如余额不足、权限拒绝) | 定义继承自Exception或RuntimeException的类,添加构造方法用于传递异常信息 |
最佳实践:
- 创建领域特定异常
- 实现异常转换(
SQLException→业务异常)- 全局异常处理器统一处理
3. JavaFX:GUI开发之旅 掌握不是很好
学习路径:
- 基础布局(掌握
VBox/HBox/GridPane)→ 2. 事件处理(按钮点击等交互)→ 3. 数据绑定(属性自动同步)→ 4. 组件封装→ 5. CSS样式美化
关键学习体会
-
布局系统:从随意摆放控件到理解约束机制,用Scene Builder工具大幅提升效率
-
数据交互:发现
Observable对象与界面的自动同步功能,减少大量手动更新代码 -
线程安全:曾因在后台线程修改UI导致程序崩溃,从此牢记使用
Platform.runLater()
下一步目标
- 学习3D图形开发,尝试制作简单的三维模型展示
- 研究数据可视化组件,实现动态更新的图表效果
- 掌握页面转场动画,提升界面交互体验
JavaFX让程序从命令行交互走向可视化界面,是面向用户的重要一步。
🛠 (4)设计模式实战精要 现在会的还不多
1. 工厂模式:对象的诞生
// 简单工厂模式
Shape circle = ShapeFactory.createShape("CIRCLE");
// 工厂方法模式
UIFactory factory = new WindowsUIFactory();
Button button = factory.createButton();
应用场景:在跨平台应用开发中:
- 隔离具体类创建
- 轻松支持新平台
- 保持客户端代码稳定
2. 单例模式:唯一的王者
// 双重检查锁定单例
AppConfig config = AppConfig.getInstance();
String value = config.getConfigValue("key");
实战应用:全局配置管理:
- 确保所有模块访问同一配置实例
- 避免重复加载配置文件
- 提供统一访问点
3. 状态模式:行为的变形金刚
// 电梯状态模式
elevator.setState(new MovingState());
elevator.move(); // 行为随状态变化
解决痛点:在电梯控制系统中:
- 消除大量
if-else状态判断- 避免状态转换时的条件竞争
- 降低新增状态的风险
4. 策略模式:算法的自由切换
// 排序策略应用
sorter.setStrategy(new QuickSort());
sorter.executeSort(data); // 随时切换算法
项目价值:在数据分析工具中:
- 运行时动态切换算法
- 新增算法不影响现有代码
- 提升单元测试便利性
(5)面向对象设计原则:编程世界的生存法则 重要
在编程进阶的路上,面向对象设计原则才是 “隐藏BOSS”,它们就像游戏攻略,能帮代码少走弯路:
| 原则名称 | 核心要点 |
|---|---|
开闭原则(OCP) |
对扩展开放,对修改关闭,让代码轻松应对新需求,无需大幅改动原有逻辑 |
单一职责原则(SRP) |
一个类只负责一项任务,确保职责清晰,避免功能混杂造成代码混乱 |
里氏替换原则(LSP) |
子类能够完全替代父类,保障继承体系稳定可靠 |
依赖倒置原则(DIP) |
高层模块不依赖底层模块,而是依赖抽象,提升代码可维护性与扩展性 |
接口隔离原则(ISP) |
将接口拆分为多个小而精的接口,让实现类仅依赖所需接口,防止接口臃肿 |
这些设计原则相辅相成,掌握它们就像拥有了代码优化的"万能钥匙"。好代码不仅要实现功能,更要经得起时间和需求变化的考验。
这些设计原则看似独立,实则相辅相成。开闭原则像 “主心骨”,指引代码走向灵活扩展的道路,可以说真正用好了开闭原则就好像军师运筹帷幄,决胜千里之外,只需要在现有基础啊上改进而不是推到重来;单一职责原则是 “代码质检员”,确保每个类都专注高效;里氏替换原则为继承关系保驾护航,依赖倒置原则打破层级束缚,接口隔离原则则避免接口臃肿。掌握它们就像拥有了代码优化的 “万能钥匙”,让我在编程路上越走越顺,也让我明白好代码不仅要实现功能,更要经得起时间和需求变化的考验。
💡(三) 采坑心得:在失败中汲取力量
1. 代码规范之痛
"随意命名"的代价
初期不重视规范,变量名随意取,代码排版混乱。结果后期维护时连自己写的代码都看不懂!后来通过代码审查逐渐养成良好习惯:
- 采用驼峰命名法
- 保持统一缩进风格
- 模块化组织代码
2. 调试技巧的觉醒
从盲目修改到精准定位
曾经遇到问题就像在黑暗中瞎摸,盲目修改代码浪费大量时间。学会使用IDE断点调试后:
// 调试技巧三步法: 1. 设置关键断点 2. 逐行跟踪变量变化 3. 观察调用堆栈
3. 注释价值的再发现
"导航灯"的启示
曾认为注释是"无用功",结果项目复杂后完全忘记设计思路。现在深刻理解:
graph LR A[关键代码块] --> B[详细注释] C[复杂算法] --> D[逻辑说明] E[类设计] --> F[设计意图]
4. 知识学习的误区
欲速则不达的教训
急于求成未理解透原理就写代码,导致逻辑错误频出。现在坚持:
- 先深入理解理论
- 画UML厘清关系
- 再动手实践
5. 解题习惯的重塑
谋定而后动的智慧
拿到电梯题目时未认真阅读需求,导致方向错误大量返工,尤其是在写拿到电梯的题目的时候,我并没有认真阅读题目,导致我没有理清需求,甚至我把它丢给AI,把他认为理解的需求当做题目的需求,实际上有很大的出入。现在采用:
- 仔细分析需求
- 梳理功能模块
- 画流程图规划结构
- 编写伪代码框架
(四) 改进建议及总结:感恩与期待
1. 课程建议
1️⃣希望增加更多实际案例
建议在讲解知识点时,加入:
- 热门开源项目片段分析
- 商业开发中的真实代码示例
- 复杂系统的设计演进过程
2. 总结感言
成长的基石
这门课程虽然充满挑战,但也让我收获满满。它不仅让我掌握了 Java 面向对象编程的核心技术,更培养了我解决问题的能力和坚韧不拔的学习态度。然而,学习过程中也存在一些小遗憾,知识的连贯性还有提升空间,部分知识点过渡不够自然,有时会让人感到吃力。
// 致谢代码 System.out.println("感谢老师的耐心教导 ✨"); System.out.println("感谢同学的热心帮助 🤝"); System.out.println("感谢坚持努力的自己 💪");这些宝贵的经历和知识,将成为我未来编程道路上的坚实基石,引领我走向更远的地方!
最后结语:
面向对象不仅是编程范式,更是一种思维艺术。当封装、继承、多态从概念变为手中的工具,当设计原则内化为编码本能,我真正体会到了"对象看世界"的魅力。这学期的每一行代码,每一次调试,每篇博客,都是构建编程大厦的砖瓦,而这座大厦,才刚刚奠基...

浙公网安备 33010602011771号