第三次Blog作业

一、前言

本阶段学习任务主要包括 PTA 编程作业、课程实验任务以及线下课堂三大板块,它们分别从不同维度推动了我对 Java 编程语言特别是面向对象思想的理解。

首先是 PTA 编程练习。PTA 的题目结构非常科学,前几题多用于练习基础语法和常见逻辑结构,帮助我们逐步熟悉 Java 的基本语法和类结构设计。而最后一题通常难度较大,涵盖更多面向对象的设计思维,如类的继承、接口的实现、复杂对象的组合与管理等。它不仅锻炼了我对语法的熟练度,更促使我在解题中思考设计的合理性与扩展性。

实验任务起初看上去较抽象,但实际完成后体会到其“循序渐进”的构建逻辑。从最基础的类设计,到界面搭建,再到功能联动,每一步都建立在之前的成果之上,让我逐步理解软件开发中“模块化、组件化”构建的重要性。尽管有一定工作量,但它确实大大提高了我的代码组织能力。

线下课程内容则偏重于理论知识和拓展性思维的建立,例如面向对象设计原则、常见设计模式以及 GUI 编程的基本概念等。虽然不如实际操作来得直接,但它们提供了对整个 Java 编程体系的理论支撑,为之后的实践打下了扎实基础。

二、面向对象思想学习体会

1. 封装

封装是面向对象最基础的原则之一。在本阶段的 PTA 作业和实验任务中,我逐渐认识到封装的实质并不仅是将属性私有化,而是在设计中通过封闭内部实现、暴露稳定接口来控制访问权限和保证数据安全。

比如在模拟“电商商品类”的实验中,我将商品价格设置为 private,并通过 setPrice(double price) 方法来设置价格。在这个 setter 方法中,我加入了价格不能为负数的校验逻辑。这样可以有效避免因为错误赋值导致的数据异常,体现了封装在保障数据合法性方面的作用。

但也遇到过一些问题,比如在多个类之间频繁传递数据时,我一开始会直接开放属性访问权限,导致模块之间耦合严重,修改一个字段往往会牵一发而动全身。通过反思,我逐步学习如何设计合理的访问接口,保持类之间的低耦合、高内聚。

2. 继承

继承使我们可以复用已有的代码结构,尤其是在具有强共性逻辑的系统中更是必不可少。在“图形绘制”实验中,我创建了一个包含颜色、坐标等属性的图形基类,并派生出“圆形”“矩形”等子类重写其绘图逻辑,这让我初步体会到继承在代码结构清晰化方面的重要价值。

但继承并非万能。在扩展新功能(如“带边框的图形”)时,我又新建了多个继承层次更深的子类,结果发现维护变得困难:任何对基类的修改都需要小心翼翼地同步子类;一旦继承层级过深,代码的可读性和可维护性迅速下降。

这让我理解了“组合优于继承”这一原则。在后续实验中,我开始尝试用组合模式将图形的特性作为可插拔组件注入,而不是继续扩展继承结构,代码结构也因此变得更加灵活。

3. 多态

多态是继承与接口的自然延伸,让程序能根据运行时对象的实际类型调用对应的方法,实现真正的“解耦”。

例如在支付系统模拟中,我定义了一个统一的 Payable 接口,其下有“微信支付”“支付宝支付”等多个实现类。在业务代码中,只需持有 Payable 类型的引用,便可灵活调用对应的支付逻辑。这样不仅使代码结构更简洁,也方便了后期扩展新的支付方式。

但在使用泛型、多层继承时,对多态细节的理解还不够深入。尤其是在方法重载与重写同时出现时,实际调用的是哪个方法,往往需要借助调试工具才能看清楚。后续需要进一步加强这方面的理论与实践积累。

4. 抽象类

抽象类的优势在于既可以定义共性的实现逻辑,又可以强制子类实现特定方法。例如在“技能系统”实验中,我定义了一个抽象类 Skill,其中包含一个 init() 方法用于初始化技能资源,一个抽象的 cast() 方法由各具体技能类实现。

通过这种设计,不仅保证了每个技能类都具备统一的初始化逻辑,也可根据不同需求进行定制化行为开发。但在实际设计中,我也感受到抽象类与接口边界模糊的问题,特别是当一个类既需要部分默认实现,又希望支持多个行为规范时,抽象类和接口需要合理组合,才能达到最佳效果。

5. 接口

接口在本阶段学习中非常关键,尤其在理解“Java 不能多继承,但可以多实现接口”后,我开始更多地将类的行为设计成接口,如 MovableAttackable 等。在“角色系统”实验中,角色类可以同时实现多个接口,使功能组合更加灵活多样,也符合“开闭原则”。

通过接口编程,我逐步摆脱了对具体类的依赖,开始构建更为稳定、易扩展的系统架构。

6. 集合框架

Java 的集合框架在实验和作业中频繁使用。ArrayList、HashSet、HashMap 是使用最多的三种容器,它们在处理数据列表、去重、映射等任务中极为高效。

例如使用 ArrayList 存储学生信息,实现按学号排序时,我使用了 Collections.sort 搭配 Comparator 接口,掌握了自定义排序逻辑。而在处理订单时,HashSet 用于订单号去重,HashMap 则实现了用户 ID 与用户信息的快速映射。

也曾踩过坑,比如使用 HashMap 存储自定义对象作为键,却忘记重写 equals()hashCode() 方法,导致逻辑错误。通过这些实践,我意识到理解集合背后的原理远比“会用”更重要。

7. 异常处理

在文件读取、用户输入、数据库连接等操作中,异常处理必不可少。初期我常常忽略异常处理,程序一旦出错就直接崩溃。

随着学习深入,我开始规范使用 try-catch-finally 结构,例如读取文件前先检查路径合法性,捕获 IOException 后记录错误信息并提示用户;在数据库实验中,也使用 try-with-resources 自动释放连接,确保资源不泄漏。

此外,我还尝试编写了几个自定义异常类,比如“余额不足异常”“非法参数异常”,用于表达更明确的业务含义,提升程序可读性与可维护性。

8. JavaFX 编程

JavaFX 是我第一次接触的 GUI 技术。在实验中,通过 Stage、Scene 创建窗口结构,利用 Button、TextField 等控件进行用户交互,再用 FXML 分离界面与逻辑,最后通过 CSS 美化界面样式。

我成功实现了登录界面、学生信息展示表格等小项目,理解了“事件驱动”的核心思想。但 JavaFX 内容在课程中讲解较少,学习过程主要依赖查阅文档与资料,建议后续课程中能加强对 GUI 技术的系统教学。

三、问题与反思

  1. 空指针问题频发:初期频繁遇到 NullPointerException,主要是对象未初始化、方法返回 null 未做判断。后通过统一对象初始化流程、加上判空逻辑逐步解决。

  2. 遍历时修改集合:曾在 foreach 循环中对集合调用 remove() 方法,结果抛出 ConcurrentModificationException。后改用 Iterator 方式安全修改集合。

  3. 思维未转变:最初仍用面向过程方式写程序,习惯用全局变量和静态方法处理所有逻辑。通过一系列实验,我学会将功能封装进类中,提升了程序结构性。

  4. 继承设计混乱:继承层次过深,功能重叠,修改麻烦。后来尝试用组合代替部分继承,结构更清晰。

  5. 异常处理不足:程序遇到异常时直接崩溃。现已逐步掌握 try-catch、异常日志记录、自定义异常等关键处理技巧。

  6. 集合误用:对集合性能理解不足,频繁插入操作用 ArrayList,效率极低。通过对比学习掌握了不同集合的适用场景。

  7. 注释不当:曾过度注释也曾完全不注释。后来采用 Javadoc 编写结构化注释,提升了团队协作效率。

  8. 输入输出隐患:忽视格式校验、未及时关闭流、多线程访问未同步等问题屡次发生。现在我会对所有输入数据进行预校验,使用 try-with-resources 处理流资源,并合理使用 synchronized 保证并发安全。

四、总结与建议

通过 PTA 编程训练、实验任务、线下课程等多维度的学习方式,我不仅系统掌握了 Java 基础知识,还构建了初步的面向对象思维体系。在实际开发中,我学会了如何设计类结构、管理对象、实现交互界面,并能处理大部分常见异常与集合操作问题。

当然,本阶段学习中也有不足之处。例如 JavaFX 内容覆盖不全、部分实验平台易导致代码丢失等。建议课程增加对图形界面开发的讲解,实验平台优化保存机制。

未来,我希望进一步深入学习 Java 的高级特性,如泛型编程、反射机制、设计模式、并发控制等内容,为今后开发复杂系统打下坚实基础。

posted @ 2025-06-22 14:11  AAA卤味东哥  阅读(26)  评论(0)    收藏  举报