1.前言
经过一学期的 Java 学习,我完成了从 C 语言思维到 Java 面向对象思维的初步转变,也积累了不少实践经验,现将学习情况总结如下:
一、知识学习:基础构建与思维转变
课堂与慕课的协同学习,为我搭建了 Java 知识的基础框架。慕课补充了 Java 基础语法细节,像各类数据结构的深度用法、IO 流的多样操作场景,让我能自主夯实基础;课堂则聚焦面向对象核心思维—— 封装、继承、多态的落地实践。比如设计简单的电商系统类结构时,如何封装商品属性、通过继承扩展用户角色、利用多态实现不同促销策略,这些训练帮我逐步摆脱 C 语言的过程化思维惯性。JavaFx 的学习还让我接触到 GUI 开发,了解到界面布局、事件监听的基本逻辑,拓宽了 Java 的应用认知。
二、实践任务:痛与成长并存
(一)PTA 迭代作业:电梯项目的蜕变
第一次电梯迭代作业堪称 “噩梦”。因缺乏面向对象思维,我最初用线性流程模拟电梯运行,代码臃肿且耦合度极高。比如把电梯的状态判断、乘客上下逻辑全写在主函数,调试时牵一发动全身。后续通过拆解功能模块(封装电梯类、乘客队列类、调度策略类 ),才理清 “电梯状态维护 - 乘客请求处理 - 楼层停靠逻辑” 的面向对象设计思路。后续迭代因前期架构优化,加上对多线程(处理电梯并发运行 )、设计模式(如单例管理调度器 )的尝试,开发效率明显提升,也让我切实体会到架构设计对复杂项目的关键作用。
(二)实验任务:需求迭代中的能力打磨
前四次实验围绕基础语法、类设计展开,像实现简单的图书馆管理系统(图书类、用户类、借阅逻辑 ),难度较低,主要巩固知识应用;第五次实验涉及网络编程或高级 GUI 功能,需查阅 NIO 框架、JavaFx 自定义控件等资料,逼着我学会自主检索技术文档、拆解复杂需求。不过实验系统的 “反人类” 设计确实影响效率 —— 无法便捷复用代码,迫使我养成模块化编码、及时整理工具类的习惯,也算 “反向收获”。整体实验通过持续扩展需求,强化了我对 “需求分析 - 架构设计 - 编码实现 - 调试优化” 全流程的理解。
2.面向对象技术总结
一、面向对象核心概念:从理论到实践
在本学期的 Java 学习中,我深刻体会到面向对象编程三大特性的递进关系。封装作为基础,通过将重复代码(如电梯作业中的打印逻辑)封装为独立方法,显著提升了代码复用率。例如,我将电梯状态输出封装为printStatus()方法,在不同楼层逻辑中直接调用,避免了代码冗余。继承则通过 “白箱复用” 构建类层次结构,如在航空货运系统中,通过Cargo抽象类派生出ExpressCargo、BulkCargo等子类,既复用了基础属性(重量、体积),又遵循里氏代换原则实现多态调用。多态的应用让代码更具灵活性,比如通过List
二、抽象类与接口:抽象程度的进阶
抽象类与接口的设计体现了 Java 对 “抽象” 的分层处理。当遇到方法声明相同但实现不同的场景(如航空货运系统中的deliver()方法),我定义了抽象类TransportMode,将共性行为(路线规划)抽象为具体方法,将差异化行为(运输工具选择)声明为抽象方法,强制子类实现。而接口则用于突破单继承限制,例如在实验 4 中,通过实现Comparable
三、集合框架:数据结构的工程化应用
集合框架的学习让我从 C 语言的手动内存管理中解放出来。ArrayList 的动态扩容特性解决了传统数组大小固定的痛点,例如在处理乘客队列时,直接使用ArrayList
四、异常处理与 JavaFX:短板与改进方向
异常处理是我亟待加强的薄弱环节。当前仅能使用try-catch处理编译时异常(如文件读取失败),但对运行时异常(如NullPointerException)的预防和捕获缺乏经验。在航空货运系统中,曾因未处理空指针异常导致程序崩溃。未来需养成 “防御性编程” 习惯,在方法入口添加参数校验,合理使用throws声明异常,结合日志框架(如 Log4j)记录异常堆栈。JavaFX 的学习让我接触到 GUI 开发,但复杂布局(如嵌套 Pane)和事件处理(如按钮联动)仍不熟练。
3.踩坑心得
一、需求分析:从 "想当然" 到严谨拆解
在电梯调度等大作业中,我深刻体会到需求分析的核心价值。初期按现实电梯逻辑设计代码,误将 "顺向捎带" 等复杂规则提前植入,导致三次代码重构。例如首次处理 "电梯方向与请求楼层关系" 时,未严格按题目定义的 "UP/DOWN" 状态逻辑,而是凭经验判断楼层顺序,最终输出与样例冲突。正确做法是将需求拆解为原子级规则:
输入输出格式:用正则表达式固化输入模式,避免因空格、大小写(如Wechat与Wechat的比对错误)导致的格式异常;
状态转移逻辑:用状态机模型定义电梯行为(空闲→上行→下行),每个状态仅处理对应规则,如上行时只响应高于当前楼层的 UP 请求或同方向 DOWN 请求;
边界条件:列举极端场景(如连续同楼层请求<5><5>),通过lastRequest标记去重,避免重复开门。
二、类设计:从 "迭代修补" 到架构先行
前期编码常犯 "边写边改" 的错误,在航空货运系统开发中,因未预先设计类关系,导致基类与子类属性耦合,多次修改字段命名。改进后采用 "纸上类图先行" 策略
职责单一原则:将调度逻辑从Elevator类剥离,单独封装Scheduler类,负责请求排序(如 SCAN 算法),使Elevator仅关注状态维护;
接口隔离:对类抽象出Weightable接口(定义getWeight())和Volumable接口(定义getVolume()),避免臃肿的基类设计。
三、编码陷阱与调试策略
(一)输入输出处理的血案
非 0 返回问题:在nextInt()后直接调用nextLine()会读取残留的换行符,导致输入错位。根治方案:
java
// 错误做法
int num = scanner.nextInt();
String str = scanner.nextLine(); // 读取的是换行符而非目标字符串
// 正确做法
int num = Integer.parseInt(scanner.nextLine());
String str = scanner.nextLine();
大小写敏感漏洞:在支付方式比对时,将"Wechat".equals(input)误写为"Wechat".equals(input),调试时通过 AI 生成测试用例["wechat", "WeChat", "WECHAT"]快速定位问题。
(二)逻辑错误的调试方法论
分模块验证:电梯调度中,先单独测试RequestQueue的去重功能(输入<5><5>验证是否只存一条记录),再整合到电梯运行逻辑;
日志埋点:在关键流程插入System.out.println("当前楼层:" + floor + ", 方向:" + direction),复现如 "1 10 <4,DOWN>" 场景时,通过日志发现方向状态未及时切换;
逆向推导:针对输出错误的样例,从正确输出反推代码逻辑,例如预期输出 "Direction: DOWN" 但实际为 "UP",则重点检查方向切换条件(如当前楼层≥最高上行请求时是否转向)。
四、协作与工具化思维
AI 辅助测试:用自然语言生成测试用例,如 "生成电梯上下行混合请求,包含同楼层连续请求和边界楼层(1 层和 10 层)",覆盖手动难以穷举的场景;
同学代码 review:通过对比同学的Comparator实现,发现自己在商品排序时忽略了null值处理,补充return o1 == null ? 1 : (o2 == null ? -1 : compare);
代码规范沉淀:制定个人规范文档,如变量名采用camelCase(currentFloor)、方法名动词开头(calculateFreight())、注释说明关键逻辑(而非逐行解释)。
五、进阶方向:从 "解题" 到 "工程化"
当前实践仍停留在 "功能实现" 层面,未来需强化:
设计模式深化:在电梯调度中尝试策略模式(不同调度算法作为策略接口实现),通过配置文件动态切换;
异常处理体系:为货运系统添加CargoException异常体系,区分WeightExceedException(重量超限)、InvalidTypeException(类型错误)等,用try-catch-finally确保资源释放;
性能优化:分析 ArrayList 扩容机制,在已知乘客数量时用new ArrayList<>(initialCapacity)避免动态扩容开销。
4.改进建议及总结
通过本学期 Java 学习,我在需求分析、类设计及编码调试中形成系统性改进策略。需求分析上,学会用原子拆解法规避 “想当然” 陷阱,如电梯作业中严格按题目定义状态逻辑,用正则表达式固化输入格式,避免因大小写、空格导致的格式错误。类设计采用 “纸上类图先行”,按职责单一原则拆分模块,如将电梯调度逻辑独立,减少耦合。
编码调试中,针对输入输出痛点,统一用parseInt/parseDouble替代nextInt/nextDouble,彻底解决非 0 返回问题;通过 AI 生成测试用例覆盖边界场景,如连续同楼层请求去重验证。此外,养成代码规范习惯,用camelCase命名变量,关键逻辑添加注释,提升可读性。
未来需强化设计模式应用,尝试策略模式优化电梯调度算法;完善异常处理体系,区分业务异常类型;结合 JVM 调优知识,优化集合框架使用。编程本质是逻辑具象化,唯有将每次实践中的错误转化为方法论,才能从 “实现功能” 进阶到 “构建可靠系统”。