第三次Blog作业-Java面向对象程序设计课程总结

前言

四个月的时间转瞬即逝,Java面向对象程序设计的课程也即将完结,经过这四个月的摸爬滚打,我虽然不是完全掌握了这门课程,但是对其中的知识还是了解得较为全面的,从最开始通过教材自主学习Java的语法,到中间跟着老师学习面向对象编程的知识,再到最后能够自己独立完成课程组布置的PTA作业,实验,Blog作业,我不仅是简单学习了一门课程,更是深刻的锻炼了自己的学习能力,从点到面,举一反三,先跟着老师走,在学会自己走,这四个月我的感受良多,收益颇丰,这篇Blog就是我对这门面向对象程序设计课程的一个总结。
整门课程分为线上课程以及线下课程,作业有Blog作业、PTA作业、实验,我先简单的总结一下这些部分。

线上课程

线上课程是学校课程组为我们免费提供的课程,我们在学堂在线上进行学习和讨论,线上课程基本和线下课程同步,当我们学习了线下课程后,线上对应的课程也会关闭,线上课程在我看来是引领我们走进面向对象程序设计的课程,同时给我们提供预习的途径,让我们不至于在线下学习时跟大一刚接触C语言那样一头雾水,线上课程是我们学习这门课程不可或缺的一部分。

线下课程

线下课程就是在教室跟着老师学习面向对象程序设计的知识,因为这门课程叫做面向对象程序设计,所以我们并没有跟着学校的教材上,学校的教材是从语法开始,一步步打基础的学习,而这部分由我们自己完成,老师则是注重讲面向对象这个概念,以教材和线上课程为辅,以线下课程和作业为主,这就是我的学习方式。

Blog作业

Blog作业是每一次PTA题目集迭代作业结束后我们对其进行的总结,主要是对每次题目集最后的迭代作业进行分析和总结,第一次的电梯迭代作业直接给刚入门的我们当头一棒,让我们提前体会了算法的难度,可现在来看,所谓Look算法其实并没有那么复杂;第二次的航空客运订单迭代作业则是更注重面向对象程序设计中的类设计,在我看来这种作业才是我们学习面向对象编程更需要的。在Blog作业中,我们总结每一次迭代作业的学习心得和踩坑建议,也通过SourceMonitor等软件对自己的代码进行分析,提出改良和优化建议。Blog作业记录每一个阶段我们的学习,也是这门课程中必不可少的一部分。

PTA作业和实验

PTA作业是我认为整门课程中最难的一部分了,每一次的题目集都会给我们一周的时间去完成,每一次PTA迭代作业的难度和工作量都让我身心俱疲,每天花费好几个小时的时间去完成却往往只取得一点成果。但是难归难,PTA作业也是课程中最能锻炼我们编程能力的部分,时刻令我们保持学习热情和编程手感。到现在我还是忘不了第一次电梯迭代作业给我带来的恐惧和压力,让我现在去重新写我也没有把握能够完成;但是第二次的客户订单迭代又是我最喜欢的一次作业,因为它没有算法的难度,转而考验我们的类设计,我认为这才是我们更需要锻炼的能力。
实验其实也可以算作是一次大的迭代作业,每一次实验都对应我们学习的进度,一次次运用新学习的知识对最开始的大象冰箱程序进行改进和扩展,也是帮助我们应用和巩固所学知识的重要环节。

面向对象技术总结

封装

在一开始的学习中我只是知道Java中有封装这个概念,但是我并没有真正理解封装的内涵和重要性。最初我只把封装看作是一种语法要求,经过面向对象程序设计课程的系统学习后,我认识到封装是面向对象程序设计中最基础、最重要的原则之一,它是设计健壮、可维护代码的关键。良好的封装可以减少模块间的耦合度,提高代码的可重用性,在 Java 中,封装通过“将数据隐藏在对象内部,只允许通过公开方法访问”来实现。这种机制大大增强了程序的安全性与可维护性。
在多个PTA作业和实验中,我深刻体会到“封装”不仅仅是变量私有化,更重要的是通过方法对外暴露合理的访问接口,隐藏内部实现细节,例如在“大象装冰箱”实验中,我通过将 Elephant 类的体重、高度等属性设为 private,再通过 public 的 getter/setter 方法访问,有效实现了对属性的控制。在初期学习时我容易习惯性将所有属性设为 public,没有意识到封装的重要性,有时在设计复杂系统时,我仍然会暴露过多的内部细节,特别是在时间紧迫的情况下,容易忽视封装的严谨性。

继承与多态

继承和多态是面向对象编程中最为强大的特性之一。通过继承,我们可以建立类之间的层次关系,实现代码的复用,而多态允许父类引用指向子类对象,在运行时自动调用实际子类方法,允许我们以统一的方式处理不同类型的对象,极大提升了代码灵活性与可扩展性。
通过多个类结构设计练习(如电梯模拟、动物管理系统等),我掌握了 Java 的继承机制。比如抽象一个 Animal 父类,派生出 Elephant, Tiger, Lion 等子类,每个子类复写父类方法,实现各自特有行为。在PTA的一个卡片图形作业中,我设计了一个图形父类Shape,派生出Circle、Rectangle和Triangle等子类。通过重写父类的draw()和calculateArea()方法,实现了运行时的多态行为。我最初认为继承主要是为了复用代码,后来理解到它更重要的作用是建立"is-a"关系,实现抽象和多态。合理使用继承可以大大简化复杂系统的设计。在使用继承和多态的知识时,我也遇到了很多问题,我有时会过度使用继承,导致类层次过深。学习了"组合优于继承"原则后,我开始反思之前的一些设计决策。

抽象类

抽象类是我在面向对象编程中遇到的第一个抽象概念。通过课程学习和实践,我理解了抽象类是介于普通类和接口之间的一种特殊类,抽象类是不能实例化的类,用于作为其他类的通用模板。它既可以包含抽象方法,也可以包含普通方法,普通方法给子类继承使用或重写,而抽象方法在子类中必须得到实现。
我在动物、电器模拟中大量使用抽象类例如定义Animal、Electric等类,将共同属性和部分方法放在抽象类中;将具有差异化的行为留给子类去实现。同样在PTA卡片游戏的作业中,我设计了一个抽象类Shape,派生出Circle、Rectangle和Triangle等子类,每个子类都实现了Shape类中的getArea()方法计算面积。在代码复用上,抽象类允许我们将公共实现放在基类中,避免了在多个子类中重复相同的代码,一开始我在抽象类中只定义抽象方法,后来才意识到抽象类中也应适当实现通用方法,这样可以大大减少重复代码。

接口

接口是Java中另一种强大的抽象机制。与抽象类不同,接口只定义行为规范,不包含任何实现细节。通过课程学习,我理解了接口的核心价值在于定义"契约",而不关心具体的实现方式。
Java类只能单继承,但可以实现多个接口,当要实现多重行为继承时,就要用到接口。在刚开始学习抽象概念时,我一度没有弄清抽象类和接口的差别,不知道什么时候该用接口,什么时候该用抽象类,但后来我认识到当需要定义一些类的共同模板,且这些类之间有明显的"is-a"关系时,使用抽象类更合适,而当需要定义跨继承体系的行为契约,或者需要实现多重继承时,接口是更好的选择。随着接口功能的增强,很多以前必须使用抽象类的场景现在可以用接口替代,但并不意味着抽象类应该被完全抛弃。我对接口的运用远不如抽象类运用的熟练,所以在写作业时一般一个类只继承一个接口。最典型的例子就是我在实验四中设计了 Aggressive 接口:public interface Aggressive { void attack(); void eatOtherAnimal(Animal other); } ,只有具有攻击性的动物比如老虎,狮子才实现这个接口。此外,在集合排序中,我学习了 Comparable 和 Comparator 接口,并能用 Collections.sort() 对对象列表进行自定义排序。

集合框架

Java集合框架提供了丰富的数据结构和算法实现。从最初只会使用ArrayList,到现在能根据具体需求选择合适的集合类,我理解了不同集合实现背后的数据结构和性能特征。通过PTA作业和实验项目,我熟练掌握了ArrayList、LinkedList、HashSet、HashMap等常用集合类的使用。
在实验中,我使用泛型,定义List,使得类型更安全,同时也使用了Comparable和Comparator两种不同的方法对动物列表进行排序。但是我最熟悉的还只是ArrayList和LinkedList集合,对于其他高级集合如TreeMap, PriorityQueue等还是了解不足,对于集合嵌套的使用如 Map<String, List>处理也不够熟练,需要进一步去学习和了解。

异常处理

Java的异常处理机制是一种用于处理程序运行时出现的错误和异常情况的机制,它可以帮助程序在遇到异常时避免崩溃,并能够以一种合理的方式处理错误,简而言之就是使你的程序变得更加优雅。
异常是指程序运行过程中出现的不正常情况,例如除以零、数组越界、文件找不到等。Java提供了几个关键字用于处理异常:try:用于包裹可能出现异常的代码块。catch:用于捕获并处理异常。一个try块可以有多个catch块,分别捕获不同类型的异常。finally:用于执行清理操作,无论是否捕获到异常,finally块中的代码都会被执行。通常用于关闭资源,如文件流、数据库连接等。throw:用于手动抛出异常,可以抛出系统定义的异常,也可以抛出自定义的异常。throws:用于声明方法可能会抛出的异常,调用该方法时需要处理这些异常(通过捕获或继续向上抛)。
异常处理的基本流程就是:捕获异常,抛出异常,以及声明异常和自定义异常。异常处理要合理捕获异常,不应该捕获所有异常,而是尽量捕获具体的异常类型;同时要避免过度使用异常处理,不应将异常处理作为正常的程序流程控制手段,最后要在finally块中清理资源,确保资源不会因为异常而泄露。

JavaFX

JavaFX 是 Java 官方推出的现代化 GUI 框架,用于开发跨平台图形用户界面应用程序,具有结构清晰、功能强大、界面美观等特点。在这门课程的实验五以及GUI作业中我们都用到了JavaFX,一个是为动物电器程序设计图形界面,一个是为第二次迭代作业的客户订单程序设计图形界面,通过这两次作业,我学会了JavaFX的基本用法,也能够独立设计一些较为简单的图形界面。
JavaFX的核心概念有:1.Stage(舞台):相当于应用程序的窗口,是最顶层的容器;
2. Scene(场景):包含所有界面元素的容器,一个Stage可以切换多个Scene;
3. 节点(Node):所有界面元素的基类,如按钮、文本框等都是节点;
4. 布局(Layout):控制界面元素的排列方式,如VBox垂直排列、HBox水平排列;
在熟悉掌握各控件的使用方法后就可以进行简单窗口程序的开发,这又让我想到了C语言的课设,同样是设计图形界面,JavaFX可不像EGE那样还要手搓代码,工作量减轻了很多。

踩坑心得

1. 面向过程思维惯性难改

刚接触 Java 时我习惯用 C 语言那一套逻辑,导致程序结构混乱,方法职责不清。随着实验项目增多,我逐步学会通过类、方法、接口来组织代码。

2. 类设计初期缺乏抽象意识

一开始在做实验和PTA作业时常出现类职责过多或过于细碎的问题,后来通过 PowerDesigner 类图工具加强了对类设计的可视化理解,用多了PowerDesigner之后,觉得类设计没有那么抽象了,在每次动手写代码之前先用PowerDesigner设计好大概的类图会让后面的工作更加井井有条,方向明确。

3. 多态与泛型理解浅

例如在实验四中, List 中实际存储 Elephant, Lion 等对象时,我最初不理解为何可以统一处理,逐步通过调试理解了向上转型与动态绑定机制。一开始我并不是很理解多态的概念,可是写着写着就知道什么是多态了,也知道怎么去运用了,所以实践才能出真知啊,任何知识都不应该只存在纸上和脑子里,只有多用才能把它真正转化为自己的东西。

4. 异常处理不当

初期对异常机制不敏感,直到我在线下课程写老师给的例子时程序因输入非法数据崩溃,才意识到异常处理对健壮性的重要性。

5. 图形界面“会看不会做”

JavaFX 的引入让我一度感觉“学不会 GUI”,直到通过模仿、改造别人的代码,结合实际功能要求,才真正体会到事件监听、组件布局的逻辑。课程组组织的翻转课堂很大程度上促进了我对JavaFX的学习,通过学习别的小组做的PPT和自己做PPT我一步步从理解到应用JavaFX的知识。所以学习编程还是要大家多交流,多讨论,多展示才能学的更快更好,不要吝啬自己的知识。

改进建议及总结

总结

面向对象程序设计这门课程让我体会到了一种不同与面向过程程序设计的编程方法,这门课程带给我的不仅是 Java 技术的系统掌握,更重要的是编程思维的升级。在各个阶段的 PTA 作业与实验中,我从最开始追求“写出结果”,逐步过渡到“结构清晰”、“扩展性好”等综合设计目标,养成了精益求精的好习惯,我会对自己写的代码不断进行优化和扩展,追求在功能实现上“简约而不简单”,这也影响了我的生活习惯,我开始追求高效的生活,做事不拖泥带水,该学习的时候就要全身心的投入进去,这样才能给自己带来最大的收益。
通过本学期的学习,我理解了面向对象三大特性(封装、继承、多态)的本质和应用场景,掌握了接口和抽象类在系统设计中的关键作用,熟练使用集合框架处理各种数据结构和算法问题,能够构建具有良好异常处理的应用程序,也具备了开发基本JavaFX图形界面应用的能力。但这些远远不够,在面向对象程序设计的道路上,我会不断地学习并运用新知识,不断提高自己的水平,争取成为一个合格的程序员。

改进建议

本门课程在教师、课程设计、作业、实验、课上及课下组织方式等方面都无愧于国家特色课程,来到南昌航空大学学习这门课程是我的荣幸,最后谢谢各位老师及课程组,让我懂得面向对象不是一个语法点,而是一种思维方式,感谢这门课程让我走进了“以对象为中心”的编程世界,也为我的软件开发之路奠定了坚实基础。

posted @ 2025-06-21 22:14  tyc114514  阅读(22)  评论(0)    收藏  举报