面向对象课程总结性Blog

前言

  1. 这门课程的Blog作业难度不高,主要是对写过的迭代题以及最近所学的知识进行总结以及自我反思,工作量算中等。

  2. PTA作业的迭代作业电梯的工作量很难度都很大,但是后面的航空货运系统的题目难度降低了很多,主要是考察面向对象的原则使用,去除了算法困难。其他的一些题目难度和工作量都没有很大,有时会卡一会也是有个别测试点不好过。

  3. 实验难度比较低,涉及的基本都是比较基础的简单的知识,但是工作量非常大,因为要全部手敲到实验系统里面,很容易敲错,还十分难改正。

  4. 线上课程的学堂在线工作量和难度都不算大,题目比较基础,都是一些概念,讲解的语法以及知识比较精简,很干练。

  5. 线下课程工作量和难度都很低,上课基本就是讲解很基础的知识,例题也是很基础的,没有难度,很适合初学者听。

面向对象技术总结

一、封装

封装是面向对象编程的基石之一,通过这学期的学习和实践,我对封装有了更深刻的理解。封装不仅仅是简单地将类的字段设为private并提供getter和setter方法,它更是一种设计哲学。在完成PTA作业和实验项目时,我逐渐体会到良好封装带来的好处:首先,它保护了对象的内部状态不被随意修改,比如在实验中,通过封装可以确保动物的属性不被随意更改;其次,封装隐藏了实现细节,使得类的内部实现可以自由变化而不影响使用该类的其他代码,这在实验项目中修改数据结构时特别有用;再者,封装使得类具有更清晰的边界和责任划分,每个类只需要关注自己的核心功能。不过我也发现自己有时会过度封装,比如为每个字段都机械地添加getter/setter,而没有考虑实际需要,或者将一些本应独立的功能也封装进类中,导致类的职责过重。未来我需要更多地思考"什么应该暴露,什么应该隐藏"这一封装的核心问题。

二、继承

继承机制的学习让我理解了代码复用的艺术。通过extends关键字,子类可以继承父类的属性和方法,这种"is-a"的关系在PTA作业中的动物类层次结构中得到了很好的体现。我学会了如何使用super关键字调用父类构造方法和方法,理解了方法重写(override)与方法重载(overload)的区别。在实验项目中设计GUI组件时,继承让我能够扩展现有控件功能而不用从头开始编写。但我也意识到继承的滥用会导致代码脆弱—父类的修改可能意外破坏子类功能,这就是所谓的"脆基类"问题。在做实验时,通过大象和狮子和老虎继承于动物类并且重写makeSound()方法,我深刻体会到了继承带来的便利以及可读性但是继承也会导致代码耦合度高,不易维护和扩展。现在我更倾向于遵循"组合优于继承"的原则,只有在确实存在明确的is-a关系时才使用继承。未来我需要学习更多关于如何设计可扩展的继承体系的技巧,特别是在大型项目中。

三、多态

多态是面向对象编程中最强大的特性之一,它让程序具有了极大的灵活性。通过这学期的学习,我理解了多态的两种形式:编译时多态(方法重载)和运行时多态(方法重写)。在PTA作业中,当使用父类引用指向子类对象时,我亲眼见证了Java虚拟机如何根据实际对象类型调用相应的方法。这种机制在PTA的题集中特别有用,我可以定义一个统一的Shape接口,然后让各种形状的粮仓实现自己的计算体积方法。多态配合集合框架使用时尤其强大,比如将不同子类对象放入一个父类类型的集合中,然后统一处理,就像是实验把动物放入容器中一样。但我也遇到了一些挑战,特别是在类型转换和instanceof的使用上,有时会因为不恰当的类型判断导致ClassCastException。通过调试这些错误,我更加理解了Java的类型系统。未来我希望能够掌握更多基于多态的设计模式,如策略模式和状态模式。

四、抽象类与接口

抽象类和接口的学习让我理解了Java中更高层次的抽象机制。抽象类用于定义那些不应该被直接实例化的概念性类,比如在PTA作业中的"图形"基类,它定义了公共接口但保留某些方法为抽象。接口则定义了一组行为契约,实验项目中的"可序列化"接口就是一个很好的例子。在实验中页通过comparable和comparator接口来实现collection的排序。Java 8引入的默认方法让我可以在接口中提供方法实现,这解决了接口演化的问题。但在实际使用中,我有时会困惑于何时使用抽象类、何时使用接口。通过多次实践,我总结出:当需要定义模板方法或共享代码时用抽象类,当强调行为契约或需要多重"继承"时用接口。我还需要进一步学习接口的默认方法在API设计中的最佳实践,以及如何设计既灵活又稳定的接口层次结构。

五、集合框架

Java集合框架的学习极大地提升了我的编程效率。通过大量的PTA作业练习,我熟悉了List、Set、Queue和Map这四大类集合及其常用实现。ArrayList和LinkedList的性能比较实验让我深刻理解了随机访问和频繁插入删除场景下的选择依据。HashSet和TreeSet的区别帮助我理解了哈希表和红黑树的不同应用场景。在最后一次题目集的最后一题中,我特别欣赏Map接口提供的键值对存储能力,它解决了许多实际的数据关联问题。集合框架与泛型的结合使用使得代码既安全又表达力强,比如List明确规定了列表元素的类型。但我也发现自己对Map的使用还是很少,了解也很少。未来我计划通过研究JDK源码来深入理解各种集合的内部实现机制。

六、异常处理

异常处理机制的学习让我编写出了更健壮的程序。通过这学期的实践,我理解了受检异常(checked exception)和非受检异常(unchecked exception)的设计哲学差异。在PTA作业中处理文件I/O操作时,必须处理的IOException让我体会到了Java强制异常处理的优势。但异常处理也有其复杂性—我曾在PTA某一题目中因为不恰当的异常捕获而掩盖了真正的错误,或者在应该抛出异常时却返回了特殊值。异常处理的性能影响也是我需要考虑的方面,特别是在高性能场景下。通过阅读优秀开源代码,我学到了异常应当用于异常情况,而不应该作为常规控制流使用。未来我需要学习更多关于异常处理策略的知识,特别是在分布式系统中的异常传播和处理。

七、JavaFX

JavaFX的学习带我进入了图形用户界面编程的世界。通过实验项目,我掌握了JavaFX应用的基本结构,从Application类继承,重写start方法,和UI组件结合,完成了点击按钮时动物进入冰箱的动画。Scene Builder工具的使用让我能够可视化地设计界面,然后通过FXML与控制器类关联。我学会了使用各种布局管理器如VBox、HBox和GridPane来创建响应式界面,理解了绑定(binding)机制如何自动保持界面与数据的同步。事件处理机制的学习让我能够响应用户交互,从简单的按钮点击到复杂的拖放操作。CSS样式支持让界面美化变得简单而强大。但JavaFX的学习曲线也让我遇到了挑战,特别是在多线程编程方面—长时间运行的任务会阻塞JavaFX应用线程导致界面冻结,Platform.runLater()的使用解决了这个问题但增加了复杂度。动画和过渡效果的创建也比我最初想象的要复杂。未来我计划深入学习JavaFX的图表控件和3D功能,以及如何将JavaFX与现代Web技术结合使用。

采坑心得

  1. 在封装概念学习初期,我曾机械地为所有字段添加getter/setter,导致出现了"过度封装"问题。有次PTA作业中,我为一个包含20个字段的类生成了40个访问方法,实际上其中三分之二的字段根本不需要外部访问,很浪费时间,也导致代码很冗杂。

  2. 在学习继承多态的时候,我经常分不清方法重载和方法重写。

  3. 在写航空货运系统的题目时。经常出现非零返回,后面发现是因为没有在每次循环都重新创建一个货物对象,导致一直是用的同一个货物对象,这个问题我在期中考试也犯过,狠狠记住了。

  4. 在写题时我总是很心急想立马开始动笔,导致很多次写到一半发现我没审清楚题目,又推翻重来,非常浪费时间和精力,以后一定要认真读清楚题目再动手!!

改进建议及总结

总的来说,面向对象这门课程迭代量较大,但是语法不难,主要是注重面向对象的编程,紧紧围绕单一职责原则,开闭原则,里氏替换原则,接口隔离原则,依赖倒置原则,迪米特原则,合成复用原则这几大原则。这几大原则贯穿了面向对象的学习之路。通过这门课程,我不仅掌握了Java核心技术,更重要的是培养了面向对象思维方式和解决实际问题的能力。从最初的语法困惑到能够完成完整的GUI应用开发,这个成长过程让我受益匪浅。最大的收获是认识到编程不仅是写代码,更是一种系统化的思考方式。也让我深刻意识到,有时候代码不仅仅要能运行,更要面向对象,这样才叫真正规范的好代码。还有,以后一定要认真读清楚题目再动手!!

我觉得上课的时候可以有一些常见陷阱专题的讲解,多总结一些坑。也可以多布置一些题目,增强我们的熟练度。实验系统也可以适当提升,手敲代码真的有点太费精力和时间了。

posted @ 2025-06-17 22:15  Huuui  阅读(18)  评论(0)    收藏  举报