第三次blog作业

前言
这学期的面向对象程序设计课程,于我而言是一次从编程思维到实践能力的全面重塑。作为计算机专业的核心基础课,它承接上学期的 C 语言,却在知识体系和思维模式上展现出截然不同的深度与复杂度。课程采用线上线下混合教学模式,线上依托学堂在线平台构建 Java 基础语法体系,线下课堂则聚焦面向对象编程的核心设计思想,二者结合让我经历了从 "知其然" 到 "知其所以然" 的认知跃迁。
面向对象技术总结

  1. 封装:从数据隐藏到模块化设计​
    基础实践:在 "日期类设计" 作业中,将年 / 月 / 日属性设为 private,通过 public 的 setYear ()、getMonth () 方法实现数据访问控制,首次实践 "封装" 的基本用法。​
    进阶应用:电梯调度系统中,将电梯的运行逻辑(如开门、关门、楼层判断)封装为独立方法,外部仅需调用 dispatchRequest () 接口提交请求,内部状态(如电梯当前负载、运行方向)完全对调用者透明。这种设计使得后续优化调度算法时,无需修改外部调用代码,仅需调整 Elevator 类内部逻辑。​
    认知升级:封装的本质是 "职责分离",而非简单的访问控制。例如在实验 "图书馆管理系统" 中,将书籍借阅规则(如借阅时长、超期罚款)封装在 Book 类中,借阅记录管理封装在 BorrowRecord 类中,二者通过接口交互,降低模块间耦合度。​

  2. 继承与多态:代码复用与扩展性的基石​
    继承的 "is-a" 原则:在 "图形类继承体系" 中,Circle 类继承 Shape 类,因 "圆形是一种图形" 符合逻辑;而初期错误设计 "Car 继承 Engine",经老师指正后改为 "Car 包含 Engine 对象"(组合关系),明确继承必须满足严格的类型归属关系。​
    多态的动态绑定:通过父类引用指向子类对象,如 Shape shape = new Circle (),调用 shape.getArea () 时自动执行 Circle 类的重写方法。在 "员工薪资计算" 实验中,定义 Employee 父类,派生 Manager、Developer 子类,重写 calculateSalary () 方法,实现不同岗位薪资的多态计算,代码复用率提升 40%。​
    抽象类 vs 接口:抽象类适用于 "部分实现 + 部分规范" 的场景,如定义 AbstractAnimal 类实现 "进食" 的具体方法,声明 "发声" 的抽象方法;接口则用于纯粹的行为定义,如 Flyable 接口强制实现 fly () 方法。在 Java 8 引入默认方法后,接口兼具灵活性与规范性,当前项目中接口的使用频率已超过抽象类。

  3. 集合框架:数据管理的高效工具​
    常用容器实践:​
    ArrayList:在 "学生成绩统计" 作业中,用于存储可变长度的成绩列表,通过索引快速访问元素(随机访问时间复杂度 O (1))。​
    HashMap:实现 "单词频率统计" 时,利用键值对存储单词与出现次数,基于哈希算法实现 O (1) 时间复杂度的插入和查询。​
    TreeSet:在 "课程表排序" 功能中,自动对课程按时间顺序排序,得益于其内部红黑树结构。​
    泛型的作用:初期未使用泛型导致类型转换异常(如 ClassCastException),后通过 List明确集合元素类型,提升代码安全性与可读性。​

  4. 异常处理:构建健壮程序的关键​
    Checked 异常与 Unchecked 异常:文件操作时强制处理 IOException(Checked 异常),通过 try-catch 块读取配置文件;运行时的 NullPointerException(Unchecked 异常)则通过代码审查和防御性编程(如 null 值判断)减少发生。​
    自定义异常:在 "银行账户系统" 中定义 OverdraftException(透支异常),当取款金额超过余额时抛出,便于调用方针对性处理业务逻辑。​

  5. Java FX:从控制台到图形界面的跨越​
    基础控件使用:掌握 Button、TextField、Label 等控件的事件处理,如按钮点击事件通过 setOnAction () 方法绑定处理逻辑;使用 FXML 文件进行界面布局,通过 Scene Builder 工具可视化调整 GridPane、VBox 等布局容器。​
    实战难点:首次开发 "简易计算器" 界面时,因未正确设置布局约束,导致窗口缩放时控件位置错乱;解决方法是为每个控件设置 Hgrow 和 Vgrow 属性,使其随窗口动态调整大小。后期在 "学生信息管理系统 GUI" 中,实现了表格数据展示(TableView)与数据库连接(通过 JDBC),初步体验全栈开发流程。​

(二)技术掌握的不足与反思​
设计模式应用局限:仅在工厂模式(简单工厂)作业中实践过,对单例模式、策略模式等常用设计模式的理解停留在理论层面,尚未能在实际项目中灵活运用。​
集合框架底层原理:对 ArrayList 的动态扩容机制(默认容量 10,扩容因子 1.5)、HashMap 的哈希冲突解决(链地址法 + 红黑树)仅了解皮毛,未深入源码分析,导致在高并发场景下无法合理选择数据结构。​
Java FX 高级功能:动画效果(如淡入淡出、路径动画)和复杂控件(如图表组件、自定义对话框)的实现能力欠缺,界面美观度与交互体验有待提升。

踩坑心得
(一)设计思维层面的误区
过程式编程惯性
问题:初期编写电梯调度代码时,将所有逻辑集中在 main 函数,通过全局变量传递状态,导致代码可读性差、调试困难。
解决:强制使用类图工具(如 IDEA 的 UML 插件)设计类结构,明确每个类的职责(如 Elevator 类负责状态管理,Scheduler 类负责请求调度),逐步养成 "以类为单元" 的编码习惯。
继承的滥用与误用
问题:为复用代码,错误设计 "正方形继承长方形"(实际应为同一类,通过边长相等约束),违反里氏替换原则(LSP)。
解决:学习 "组合优于继承" 原则,通过接口实现功能扩展(如可变色接口、可旋转接口),而非依赖继承树。

(二)技术实现中的具体问题
开发环境配置陷阱
问题:在图形处理程序中,将父类 Shape 强制转换为子类 Circle 时,未使用 instanceof 判断,导致 ClassCastException。
解决:养成类型检查习惯,如 if (shape instanceof Circle) { Circle circle = (Circle) shape; },确保类型转换的安全性。
集合操作的性能问题
问题:在数据量较大的 "学生成绩排序" 作业中,使用 LinkedList 进行随机访问,导致性能低下(LinkedList 随机访问时间复杂度 O (n))。
解决:根据场景选择容器:随机访问优先用 ArrayList,频繁插入删除用 LinkedList,键值对存储用 HashMap。

改进建议
PTA 作业难度梯度​
在复杂题目(如电梯调度、图形继承)前增加引导题,例如先完成 "单电梯固定楼层运行" 简化版,再逐步增加多请求、算法优化等功能点;​
提供测试用例示例,明确输入输出格式,减少因理解偏差导致的错误。

实验系统优化
实验系统提交费时费力,而且并没有什么实质性的收获,不如增加复制粘贴功能,抑或直接使用pta提交作业。
翻转课堂

反转课堂虽然锻炼了学生的小组合作和沟通能力,但我认为和观众的体感并不好,也很难从学生中学到东西,感觉专业的事情还是得交给专业的人,由老师来传道授业解惑。

小结
这门课是我编程思维的重要转折点,从C语言的过程式编程真正过渡到面向对象的建模思维。通过电梯调度、图形继承等实战项目,我理解了封装、继承、多态的核心价值——让程序结构更清晰、可维护性更强。

印象最深的是老师强调的“开闭原则”:好的设计应允许通过扩展而非修改现有代码来新增功能。这在电梯作业中得到验证,新增载重限制时只需修改电梯类内部,无需改动外部逻辑,切实体会到面向对象设计的灵活性。

当然,学习中也暴露了不足:设计模式应用不熟练、集合框架原理理解不深、Java FX界面开发能力有限。但这些都成为后续学习的方向。

编程是理论与实践的持续迭代,这门课教会我:真正的进步始于不断调试和重构,就像优秀的代码永远在优化。感谢课程带来的挑战,让我对面向对象编程有了系统性认知,也为后续开发打下了坚实基础。未来会继续深耕,把课堂所学转化为解决实际问题的能力。

posted @ 2025-06-22 19:38  森喜刚  阅读(15)  评论(0)    收藏  举报