昌航面向对象课程学期总结
一、前言
经过一整个学期对Java的学习,我感受颇丰也受益匪浅,于是在此撰写博客来总结这一整个学期的历程。
Java的课程内容涵盖了Blog作业、PTA作业、实验、线上课程以及线下课程,那么依次来看其工作量和难度:博客作业在最开始我认为是一项意义不大、耗时费力的任务,但从实际完成的过程结果来看,我还是收获了许多,包括其中分享总结的乐趣以及现在回头看前两个自己所写博客作业的回味无穷。而完成博客的难度在Java这几项课程任务是较为简单的但也是我个人认为最有感觉的,撰写的时候感觉自己真的在走向编码的世界;而PTA作业则是工作量和难度相结合并且都较多的一项课程任务,有11次任务。虽然思考编写的过程让人掉头发,但每次完成时看到一片红色的答案正确,还是让人十分愉悦的,而令我意外的是感觉PTA的难度曲线在最开始的电梯难题后逐渐下降;实验则是我认为课程中工作量最大的,其难度适中。工作量大主要是由于实验提交系统的手写编码要求以及每次实验对应的实验报告。如果抛开实验提交系统较为折磨的手敲代码来看,那么每次实验让动物进入电器代码逐步迭代还是挺有意思的;而Java的线上线下课程结合,我认为还是相当友善的,工作量和难度都较为基础,线下课程蔡柯老师的讲解也让人学到了很多。
接下来,我将详细从这些课程任务的细节与重点入手来分析我目前对面向对象Java技术的认知、掌握程度和欠缺的地方。
二、面向对象技术总结
1.封装
人的思维总是容易固化的,在经过了上学期学习面向过程编程的C语言学习后,初步进入到Java课程时,我一时不理解封装的意义,不知道为什么要特意绕一个远路去实现getter、setter方法,而不是直接在过程中读取输入。但随着我在PTA和实验中不断地迭代代码,比如对PTA中雨刷问题各种类的封装和实验中对电器和动物类的封装,让我充分了解了封装性在Java整个语言思想中的核心地位,我明白封装就是将类的内部实现细节对外隐藏,只暴露必要的接口,也了解了他防止外部直接访问和修改对象内部状态,避免数据被意外破坏的作用。同时封装也让我在迭代代码时更加方便,因为当内部实现改变时,不影响外部调用代码,这增强了代码的维护性,在往后的学习,封装更是给Java中的继承和多态奠定了基础。该技术思想几乎所有Java代码都有所运用,我掌握较好,能分清public、protected、private等关键词的作用范围。
2.继承
继承就是通过关键字extends来建立类之间的"is-a"关系,实现代码复用的核心机制。在最初接触继承概念时,我觉得这只是一个避免重复代码的简单工具,但在实验中逐步构建动物和电器的类层次结构时,我深刻体会到了继承的强大之处。比如在实验中,当我需要为不同的动物(大象、老虎、狮子)添加共同的行为时,通过继承Animal基类,不仅避免了大量重复代码,更重要的是建立了清晰的逻辑关系。在PTA的一些题目比如点到线到图形中,我也学会了正确使用super关键字来调用父类的构造方法和方法,理解了方法重写的规则和@Override注解的重要性。继承为后续学习多态奠定了坚实基础,虽然Java的单继承机制一开始让我觉得受限,但现在我明白这样的设计避免了复杂的继承冲突问题。目前我对继承的掌握还算不错,能够合理设计类的层次结构,但在一些复杂的继承关系中,有时还会对访问权限的继承规则产生困惑。
3.多态
多态让相同的方法调用在不同的对象上产生不同的行为。说实话,多态是我学习过程中理解起来较为复杂的概念之一。最开始我只是机械地记住多态就是父类代指子类对象,但真正让我理解多态价值的是在实验中编写动物进入电器的叫声后。当我用同一个Animal引用调用同一个bark方法,却能根据具体的动物类型产生不同的叫声文字,我才开始理解多态的作用。在PTA的一些题目中,我也体验到了多态带来的代码灵活性,特别是在处理不同类型对象的统一容器类时。而就掌握程度而言,我虽然熟悉了一些基础的多态用法,但我还课外解到instanceof操作符和向下转型的用法,还需要更深入理解它的运行机制。
4.抽象类
抽象类是通过abstract关键字定义的抽象类为我们提供了一种介于具体类和接口之间的设计选择。在实验中,当我需要为所有电器定义一些共同的属性和方法,但又希望强制子类实现特定的行为时,抽象类就发挥了重要作用。比如定义一个抽象的Electric类,包含一些通用的属性如容量、名称等,同时定义抽象方法让具体的电器类去实现自己独特的工作方式。虽然抽象类在我平时编码作业中占代码行数不高,但它在代码架构设计中确实起到了重要的模板作用和基类作用。我发现抽象类特别适合用来定义一套规范,既能提供部分公共实现,又能强制子类完成特定功能。不过我对抽象类和接口的选择时机还不够敏感,有时候会纠结于到底应该用抽象类还是接口来设计。
5.接口
接口通过interface关键字定义的接口,规定了实现类必须提供哪些功能。在实验中,当我需要让不同的动物都是否具备攻击力时,就需要用定义一个Aggressive接口,让狮子和老虎具备攻击和吃其他动物的行为。在之后学习中我也发现接口解决了Java单继承的限制,一个类可以实现多个接口,这给设计带来了极大的灵活性。而对于接口的掌握度,同上抽象类,我虽知道接口主要是实现行为而抽象类更注重父与子类关系,但实际操作还是有不熟练的地方。
6.集合框架
集合框架中的许多工具我都经常使用,比如ArrayList,基本上许多题目都要与它打交道,这相比c语言中的基础数组、链表都要方便许多,会自己动态分配空间,非常人性化。而集合框架中的自动排序在实现相应的compareTo方法也非常的便捷。但我对其中的HashMap、HashSet的使用与理解还不熟练,只有在最后PTA检索Java代码中的操作符才使用到,还需要在往后的编码中继续锻炼。
7.异常处理
虽然老师上课讲到了异常处理,但实话说这是我使用到最少的一项技术。我虽然深知它的重要性,但是在整个Java课程中考察和使用它的场景几乎没有。我只了解throw、try-catch的一些基本语法,对于异常处理这块技术,我会在以后的代码尝试编写来提升相关的熟练度。
8.Javafx
那么说到最近学习到的Javafx了。我认为Javafx是所有技术中学习起来最有动力的一个,因为你能够创建出真正可见、可交互的图形界面程序。从最初的Stage和Scene概念学习,到后来掌握各种布局管理器如BorderPane、VBox、HBox等,在这样的学习过程中,你可以看到自己的界面逐渐丰富起来。而Javafx在线下课堂则采用了新颖的翻转课堂模式,相比听老师讲解,这样更让我了解Javafx的知识尤其是我所讲解的FadeTransition。
三、踩坑心得
在经过了一学期的学习后,我吸取了许多踩坑、走弯路的经验。
首先是电梯难题提醒了我省题,也就是写题目、项目前设计的重要性。如果我们最开始问题和需求都无法了解准确清楚,那么后续的编码就失去了方向的引导,很有可能做无用功。比如我一开始就没有完全理解电梯运行的算法,没读懂题目电梯只处理队列头部的意思从而走了许多弯路。
然后是注释的重要性。PTA的题目感受不明显,但实验代码迭代跨越的时间很长,到了后面几次试验,我因为注释的缺失造成了又要重新理解之前代码的现象,浪费了许多时间,这提醒我以后写代码要未雨绸缪,提前写好注释。
最后,我还认为敲代码的过程中需要适度的放松时间。有时候我会苦思冥想很久,一直钻牛角尖而过不去一些PTA的测试点,这样一直坐在电脑前劳神费力、恶性循环。后来,我发现此时出去跑跑步、洗个澡,回来再看题目顿时豁然开朗,所以编码时适度的休息也是非常必要的。
四、改进建议与总结
改进建议
对于PTA作业,我认为难度曲线可以设计的更加平滑合理一些,本次学期PTA作业一开始为较难的电梯,之后难度慢慢放缓,我觉得PTA的难度可以由易到难,更符合我们学习的历程。
对于实验,我觉得应当开放复制粘贴功能,机械的去在实验提交系统手敲代码,不利于代码的迭代和调试,编码过程也没有在IDE上的体验,弊端远多于利端,我认为这是课程可以改进的地方。
总结
一学期的学习也到了尾声,回首看去,这一路有痛苦也有喜悦,而这些情绪已经消散,但我获得的知识将仍存留在我的脑海。这一段时间,我通过课程充分学习到了Java中一些实用的技术,但最重要的是了解和学习到了面向对象程序设计的思想,正所谓语言是工具、思想才是灵魂,我感受着面向对象和面向过程思想的区别,逐渐从一开始大一懵懂的新生,到现在能从思路到编码的准大二新生,希望Java课程能越来越好,希望我也能继续怀抱这份热忱之心!