第三次Blog作业
一、前言
1.blog作业是这学期新接触的一种作业形式,相比于实验报告,blog需要我们投入更多的精力,也需要更加仔细地标明失败的原因,这样也好为看我们文章的人提供一些帮助。blog作业也锻炼了我们知识梳理与文字表达能力。
2.pta作业总共有11次,其实对于我们这类初学者来说学会一门语言最好的方法就是多加练习所以pta的题目量对于我来说是比较轻松的,能保证每次在题目集发布的两天后完成所有题目。而且除了第一次的电梯题在算法方面比较难,其他的pta题目的难度都在我的能力范围之内,能够做到快速上手并有思路。
3.在实验方面呢,其实每次的实验题目都相比pta的题目要简单些,而且实验的自由度很高除了实验指导书上面的一些内容是必须要包含的,剩下的一些扩展性的内容我就可以自由发挥了,所以实验也就相当于自己为自己写一个代码,用心程度全靠自觉有的人能做出一个逻辑通畅的代码,而有的人只能完成实验指导书上的要求。还有就是实验提交系统不让复制粘贴,所以每次打代码的速度都要慢许多,因为提交系统无法像eclipse一样提醒哪里有错误,也无法自动弹出方法名省的重复打。
4.线上与线下课程的安排都比较合理,我们有时可以通过线上课程温习下学过的知识理念什么的,还可以把线上课程当作一门预习课,从而减轻我们上线下课时的负担。所以我很赞同线上与线下课程同行
面向对象技术总结
1.封装
经过线上与线下课程的讲解,还有平常在pta的训练,我知道了封装是把数据和操作数据的方法藏起来,对外提供简洁接口。比如在之前的题目集4中的创建客户类题目就有涉及。
这是就可以将id、balance、annualInterestRate等属性设置为private,然后就可以通过一些getter与setter方法访问这样能有效保护数据,还让代码结构清晰。
2.继承与多态
继承可以让代码的复用变得更加简单,它允许一个类(子类 / 派生类)继承另一个类(父类 / 基类)的属性和方法,并可以在此基础上扩展新功能。多态的本质是父类引用指向子类对象。多态还是面向对象编程的核心机制之一,还有代码设计灵活、可维护和可扩展的优点。
在pta的题目集8与实验三中都有提及
我们可以将line类与point类继承于Element类,这样就可以继承Element类的属性和方法,还可以使代码更加简洁。子类还可以重写父类的一些方法,这样就还可以做到多态
3.抽象类与接口
抽象类与接口是面向对象编程中实现抽象的两种核心机制,它们通过定义规范与约束,显著提升了代码的可维护性和扩展性。包含抽象方法的类,无法实例化,需子类继承并实现抽象方法。对于接口而言一个类可实现多个接口,这样就能突破单继承限制使我们的代码更多样。抽象类与接口通过不同维度实现抽象,前者侧重代码复用与约束,后者强调行为扩展与解耦。合理使用它们,可构建出高内聚、低耦合的系统架构。
比如在题目集9的魔方问题中,我们就可以通过Comparator接口进行排序比较,让我们的代码变得更加灵活。还有在之前的航空系统的迭代作业中,还可以定义一个支付方式的接口类,使我们的代码更加清晰有逻辑
4.集合框架
集合框架是数据处理的 “工具箱”,在pta的大量作业中经常使用 List、Set、Map 等集合类来存储和操作数据。比如还是题目集9的一个题目依旧是关于点线面的题目,在原有类设计的基础上,增加一个GeometryObject容器类,其属性为ArrayList
5.异常
异常处理保障程序健壮。实验里 IO 操作、数据转换时,合理捕获和抛出异常,让程序更稳定。可一开始常忘处理受检异常,或捕获后没妥善处理逻辑,导致程序崩溃。现在虽能基本处理,但异常体系深入理解和灵活运用,比如自定义业务异常分类,还需加强 。
六、javafx
对于javafx的内容我们是以翻转课堂的形势了解的,我们通过同学们的一步步讲解了解到了javafx的基本框架,javafx它提供了一套现代化的UI组件,所有UI元素的树形结构,类似 “组件嵌套盒子”。了解到了我常用的UI组建如按钮类的Button、ToggleButton文本类Lable、TextField选择类ListView、TableView、ComboBox容器类HBox、VBox、Pane等等之类的。这些知识都在设计GUI大作时业时有使用,比如我通过VBox、HBox、Pane、Lable等方法设计出了一个简单的界面如下图。
知识总结:java的大部分知识我都掌握的还不错,能够熟练的使用封装,继承与多态,抽象与接口,但是关于集合框架以及异常的部分知识掌握的还是不够熟练,我对于集合框架仅仅只能熟练的掌握容器类但对于map以及set的掌握还是不够熟练,我无法熟练的在适当的情景下使用好他们,而且对于异常处理我也只能处理简单的异常,对于复杂的情形还是无法处理好。所以我还需要不断地学习去掌握更多知识。
踩坑心得
学习中我还是踩了不少坑,这些教训深刻地让我认识到 “正确的思维” 比 “单纯敲代码” 更重要。在编程初期,我完全缺乏面向对象的设计思维,总想着图省事,一股脑把所有功能塞进一个类中。就拿航空系统设计来说,初期我把用户管理、订单管理、航班查询、支付处理等功能一股脑全写在一个AviationSystem类里,代码量很快就膨胀到上千行。结果噩梦来了,当需要给订单管理模块增加改签功能时,因为代码高度耦合,不仅要在密密麻麻的代码里反复确认逻辑,修改一处代码还会莫名其妙影响到用户登录验证的流程,导致用户无法正常注册。为了修复新出现的问题,又不得不继续修改,陷入了 “改一处,乱一片” 的恶性循环,代码维护成本呈指数级上升。后来我才明白,这正是违背了 “单一职责原则”,一个类承担了太多本不该属于它的功能,就像让一个人同时干十个人的活,不出错才怪。所以在设计的初级阶段,一定要像搭建房屋前画好蓝图一样,提前规划好类间关系,明确每个类的职责,这样才能避免后期维护时手忙脚乱。
在调试方面,我也走过不少弯路。印象最深的是处理NullPointerException,起初我完全不得要领,一看到报错就慌了神,不看堆栈信息,也不分析报错的上下文,而是盲目地在代码里到处加null判断,幻想着 “撒网式” 修改能解决问题。结果不仅问题没解决,代码里还充斥着大量冗余的if (xxx == null)语句,让原本就混乱的逻辑雪上加霜。直到有一次,在开发一个图书借阅系统时,程序运行到借阅记录保存环节突然抛出NullPointerException,我依旧习惯性地乱加判断,折腾了整整一下午都没找到根源。后来在老师的指导下,我静下心来仔细查看调用栈信息,发现问题出在对象初始化顺序上 —— 我在使用BookRecord对象保存借阅记录时,提前调用了该对象的方法,但这个对象在调用前并没有完成初始化,导致其内部属性为空,从而引发空指针异常。这次经历让我彻底明白,调试就像医生看病,只有通过查看堆栈信息、分析报错上下文,找准 “病因”,才能对症下药,而不是盲目地做无用功。
改进建议以及总结
通过这门课,我的编程能力有了显著提升,从编程小白逐步成长为能够独立思考与实践的开发者。曾经面对类、对象、继承、多态等概念时,我如同置身迷雾,毫无头绪;如今,我不仅能熟练运用这些核心概念,还能结合实际需求,独立设计小型项目的架构。初期的代码如同毫无章法的 “杂草”,逻辑混乱、漏洞百出,甚至一个简单的功能实现都需要反复修改。但随着课程的推进,我逐渐领悟到设计原则的重要性,现在能够自觉遵循开闭原则、单一职责原则、里氏替换原则等,让代码结构更加清晰、可维护性大幅提升。
在这门课程的学习过程中,我的自学能力也在不断突破。曾经面对难题,我只会束手无策地等待他人帮助;如今,我学会主动查阅官方文档、在技术论坛中搜索解决方案,甚至通过阅读优秀的开源代码来汲取灵感。例如在实现图书管理系统的借阅功能时,遇到多线程并发问题,我通过阅读《Java 并发编程实战》相关章节,结合 Stack Overflow 上的案例分析,最终找到了解决方案。这种 “主动出击” 的学习方式,不仅让我攻克了一个个技术难关,更培养了我独立解决问题的思维能力。
对于课程设计我还是十分认同的,从基础语法的夯实,到面向对象编程的实践,再到综合项目的开发,课程循序渐进地引导我们深入学习。每一次的作业、实验都是一次挑战,也是一次成长的机会。正是在这一次次的训练中,我们的编程能力从量变实现了质变。课程中多样化的学习形式也让我受益匪浅:PTA 上的代码练习帮助我强化了基础知识的运用;实验课上的项目实战让我将理论与实践相结合;线上线下课程的互补,更是让我对知识有了全方位的理解。这些精心设计的学习环节,如同阶梯一般,助力我在编程的道路上稳步前行。