Java面向对象程序设计总结与概述
一、前言
这学期学 Java 课,通过写博客、做 PTA 题、做实验,还有线上线下上课,把 Java 和面向对象编程学了个遍。这些学习内容一环扣一环,让我从编程小白慢慢摸到了门道,写代码的能力和思维方式都进步不少。
要说作业量,真的挺充实的:一学期写了几篇博客,每篇都得琢磨好久怎么把知识点讲清楚;PTA 上每个章节都有练习题,从简单的语法题到复杂的逻辑题都有,的确提升很大;实验更费时间,一个项目得从分析需求到写完代码调试好,常常一弄就是大半天;线上线下课加起来,学得很充实。难度也是慢慢变难的:一开始学基础语法还挺简单,后来讲封装、继承这些面向对象的内容就有点绕了,到后面学集合、异常处理和 JavaFX 的时候,知识点又多又复杂,得花更多心思才能搞懂。比如在航空货运系统中,既要用集合存储多件货物信息,又要处理用户输入错误的异常,还要用 JavaFX 做订单界面,多重知识叠加让我熬了好几个通宵。不过啃下这些硬骨头后,感觉自己真的学到了不少东西,现在能独立完成小型系统的设计了。
二、面向对象技术总结
(一)封装
上课做 PTA 和实验的时候,经常用到封装。简单说就是把类里的属性藏起来(设成 private),只留 public 的方法让外面调用。比如写学生类的时候,年龄、成绩这些属性不能直接改,得通过 set 方法来设,还能在方法里加检查,比如年龄得是合理的数字,成绩不能是负数。这样做既能保护数据,又方便以后改代码。现在基本的封装我会用,但遇到复杂的业务场景,比如怎么把一堆相关属性打包管理,或者结合设计模式做更高级的封装,就有点懵了,还得再学学。
(二)继承
继承是面向对象的重头戏,我经常用它来搭类的架子。比如先写一个图形父类,里面有颜色、绘制这些通用的东西,然后让圆形、矩形这些子类继承它。在航空货运系统中,我设计了抽象的运输类(Transport),包含运输距离、基础费率等通用属性,再让航空运输类(AirTransport)继承它,添加航班号、载重量等特有属性。虽然基本语法会了,但遇到多层继承或者继承关系太复杂导致代码重复的问题,就不知道怎么处理了。比如在设计客户类时,原本想让普通客户和 VIP 客户继承客户基类,但 VIP 客户的运费折扣逻辑和普通客户差异较大,直接继承导致基类方法冗余,后来改用组合方式实现折扣策略,才解决了这个问题。
(三)多态
多态说白了就是 “同一个方法,不同对象干不同的事”。比如动物类有个叫声方法,猫和狗的子类重写这个方法,调用的时候就会分别输出 “喵” 和 “汪”。在航空货运系统的运费计算中,我用多态实现了不同货物类型的计费策略:普通货物、易碎品、危险品都继承货物基类,重写计算运费的方法,比如易碎品需要额外添加保险费用。做图形绘制实验时,把不同图形对象传给绘制方法,它会自动根据对象类型选对应的绘制逻辑,这样代码更灵活。但在货运系统中,处理多态转型时出过 bug:有次把货物对象强制转型为易碎品时,没先判断对象类型,导致程序抛出 ClassCastException 异常。
(四)抽象类和接口
抽象类就像个 “模板”,比如定义一个交通工具抽象类,里面有个抽象的行驶方法,让汽车、飞机这些子类去实现。在货运系统中,我定义了抽象的订单类(Order),包含生成报表的抽象方法,让航空货运订单类(AirOrder)实现该方法,生成订单信息报表和货物明细报表。接口则像个 “契约”,比如定义可飞行接口,让飞机、鸟这些不相关的类都实现它。我设计了支付接口(Payment),包含支付方法,让支付宝支付(Alipay)和微信支付(WechatPay)实现该接口,这样在订单类中通过接口引用调用支付方法,符合开闭原则。不过有时候分不清什么时候该用抽象类,什么时候该用接口。比如在设计折扣策略时,最初用抽象类实现,但后来需要新增折扣类型,不得不修改抽象类代码,违背了开闭原则。
(五)集合框架和异常处理
ArrayList 和 HashMap 这些集合类我用得挺熟了,比如存学生信息用 ArrayList,按姓名查成绩用 HashMap。但集合的排序、迭代器的高级用法,还有处理多线程时的并发集合,我就不太会了。异常处理方面,try-catch 捕获常见异常我会,比如文件读取错了就 catch 住报错,但怎么自己定义异常类,或者在多层代码里怎么传递异常,让错误处理更合理,我还得加强学习。
(六)JavaFX
做实验的时候用 JavaFX 做界面,登录框、查询页这些简单布局我能搞定。在货运系统中,我用 JavaFX 做了订单录入界面,包含客户信息、货物信息、运送信息的输入表单,用 GridPane 布局排列控件。但想加个动画效果,或者让界面和后台数据更流畅地交互,还有复杂的页面排版,我就搞不定了。比如想在提交订单时添加按钮点击动画,查了很多资料才勉强实现。JavaFX 和其他框架怎么结合用,我也完全没经验。
三、踩过的坑和经验
开始学的时候,净犯低级错误:忘写分号、变量没定义就用、方法参数类型不对,调试的时候能把人急死。有次在计算体积重量时,把公式里的 “÷6000” 写成了 “÷600”,导致计费重量错误,找了半天才发现问题。后来我养成了写完代码先让 IDE 检查语法的习惯,还会自己手动走查关键逻辑,少走了很多弯路。
学面向对象设计时,有次没规划好类的关系,导致代码里好多重复内容,改起来特别麻烦。在航空货运系统初期设计中,我把订单处理、运费计算、报表生成全放在一个类里,违背了单一职责原则,代码长达 800 行,调试时简直像拆炸弹。后来按照功能拆分成订单类、计费类、报表类,每个类只负责一件事,代码量减少到 300 行,维护起来轻松多了。
做航空货运功能时,折扣逻辑没理清楚,算错了总价。当时客户类型分为普通客户和 VIP 客户,VIP 客户运费打 8 折,但我在计算时把折扣逻辑写在了订单类里,导致代码耦合度高。后来用策略模式把折扣逻辑封装成独立的策略类,订单类只负责调用策略,这样新增折扣类型时不用修改订单类,符合开闭原则。
四、建议和总结
(一)学习总结
这学期从啥也不懂到能独立写点小项目,进步还是挺大的。做完航空货运管理系统后,对面向对象设计原则有了更深的理解,现在能主动用单一职责、开闭原则来规划代码结构。但我知道自己还有很多不足:技术用得不够溜,比如 JavaFX 和并发集合;代码结构设计没经验,类图规划经常需要老师的类图作为参考;团队合作开发也没怎么练过,毕竟平时都是自己单干。不过好在入了门,以后有的是机会提升。从 C 到 Java 的转变,总算是迈过来了。C 语言更注重过程,而 Java 更注重对象,刚开始经常把面向对象写成面向过程,比如把所有功能都堆在 main 方法里。通过这学期的训练,现在能自觉地把功能拆分成不同的类,用对象交互来实现需求,这是最大的收获。
(二)改进建议
PTA 可以少出点重复的基础题,多出点测试点,同时可以多给点样例,有时卡在一个测试点怎么都过不去,最后只是一个特殊的样例过不去,导致分数拿不到挺可惜的。还有实验系统的略显生硬的功能,没有更加便利的代码提交的方式都给学生造成一些不必要的困难。课堂上让学生组队互相讲解 JavaFX 的模块,但每个小组就只有很少的时间进行讲解,同学们可能就无法更加透彻的理解,还得花时间再从头学一遍,没有起到应有的作用。建议增加小组展示的时间,或者提前布置任务,让小组有更充分的准备时间,这样讲解效果会更好。总之,这学期学 Java 就像打怪升级,每个知识点都是一道关卡,打完 “封装继承” 打 “集合异常”,打完这个打那个,最后通关三个大作业大Boss。虽然过程艰辛,但现在看自己写的代码能跑起来,还是挺有成就感的。

浙公网安备 33010602011771号