我的南昌航空大学2025级Java面向对象课程作业集1-3总结
一、前言
在迄今为止的 Java 面向对象程序设计课程中,我完成了三次作业集的练习,从基础语法、面向对象核心概念到复杂业务逻辑实现,逐步搭建起了面向对象编程的知识体系。三次作业集的题量、难度与知识点分布呈现出明显的递进关系,既考验了我对基础语法的掌握,也锻炼了我面向对象的设计思维与工程实践能力。第一次作业是设计一个基础的航班货运配载模块,第二次作业在第一次作业的基础上进一步细化配载管理,分为多个货舱,同时添加了计算是否超重等功能,第三次作业真的搞得头大,在要严格联系专业知识的同时,还要同时添加数学方面的计算,有意思的一个点是老师模拟客户需求,需要自行摸索测试点,虽然过程较难,,但是成功之后的成就感还是很足的。在难度方面的感受的话就个人而言,应该是三大于一大于二,因为在第一题是接触java不久,对java相关语法了解的不是很透彻,第三题确实是花了很多心血,最可惜的是第二题由于失误不小心漏掉了 InputValidator:输入校验类,提供整数、浮点数的范围校验方法这个类,最后惨遭扣40分,以后做业务的时候一定要专心身体呀(悲)。。。
二.设计与分析
2.1 作业集1解读
以下图是SourceMonitor 报表截图

该题目一共设计了8个类,最大圈复杂度为7,平均圈复杂度为1.86
以下图是作业一的类图

类作用及关系:
- Flight 航班类
作用:整个系统的核心数据类,负责存储航班的基础信息。
地位:所有货舱、货物都依附于它,是整个配载系统的 “根对象”。 - CargoCompartment 货舱类
作用:单个货舱的数据与逻辑类。
依赖:属于 Flight 的组成部分,由 Flight 持有并管理。 - Cargo 货物类
作用:表示一件货物的数据模型
依赖:被 LoadDispatcher 调度,被 CargoCompartment 装载。 - Position 位置类
作用:表示货舱中的一个存储位置(行 + 列)。
依赖:被 CargoCompartment 持有,仅用于描述货舱容量,不参与装载逻辑。 - LoadDispatcher 装载调度类
作用:核心业务逻辑类,负责货物排序与装载调度。
依赖:依赖 Flight,是业务逻辑的 “指挥中心” - CargoResult 装载结果类
作用:封装单件货物的装载结果
特点:无状态、可复用,只提供静态方法。 - InputValidator 输入校验工具类
作用:纯工具类,不依赖任何业务类 - Main 主类
作用:程序入口,负责流程控制与控制台输出。
个人学习体会
这次作业让我第一次真正体会到 “单一职责原则” 的好处。一开始我把所有逻辑都写在 Main 里,代码又长又乱,调试起来很麻烦。后来拆分出 LoadDispatcher、InputValidator 之后,代码结构一下子清晰了,找 bug 也快了很多。
同时我也意识到,写代码不能只追求 “能跑”,还要考虑效率和扩展性。
缺点:排序实现不够高效,选择排序的时间复杂度是 O (n²),货物数量多的时候效率不高
2.2 作业集2解读
以下图是SourceMonitor 报表截图
![image]()
该题目一共设计了7个类,最大圈复杂度为4,平均圈复杂度为2.04
以下图是作业二的类图
![屏幕截图 2026-05-18 110532]()
类作用及关系: - Main(主类)
作用:程序入口,负责接收用户输入、创建对象、调用功能、输出结果 - Flight(航班类)
作用:代表一个航班,管理整个航班的所有货舱。存储航班号、最大起飞重量、最大业载重量;提供添加货舱、查询货舱、统计总重量的方法;是整个系统的核心容器。 - CargoCompartment(货舱类)
作用:表示一个货舱,管理自己的货物与载重。记录货舱编号、最大载重;存储货物列表,判断能否装入新货物;计算当前已装载重量。 - Cargo(货物类)作用:表示一件货物,纯数据载体。存储货物 ID、名称、重量、目标货舱 ID;只存数据,不处理逻辑。
- Position(位置类)作用:表示货舱里的存储位置(行、列)。用于描述货舱空间结构,生成位置名称格式。
- LoadDispatcher(装载调度工具类)作用:提供货物排序、货物查找功能。对货物按重量降序排序;根据 ID 查找货物。
- CargoLoader(货物装载类)作用:核心业务类,负责把所有货物装入对应货舱。先排序,再逐个尝试装载;判断货舱是否存在、能否装载;输出每一件货物的装载结果。
Flight 包含多个 CargoCompartment
一个航班有多个货舱 → 一对多关系
CargoCompartment 包含多个 Cargo
一个货舱装多件货物 → 一对多关系
CargoCompartment 包含多个 Position
一个货舱有多个存储位置 → 一对多关系
CargoLoader 依赖 Flight、Cargo、LoadDispatcher
装载需要使用航班、货物、排序功能 → 依赖关系
LoadDispatcher 只处理 Cargo
排序、查找都只针对货物 → 工具依赖关系
Main 调用所有类
主类启动程序、组织流程 → 总调度关系
个人学习体会
这次航班载重平衡系统是我第一次写多类协作的中型程序,写完收获非常大。首先,我真正理解了类的职责拆分。以前我习惯把所有代码写在 main 里,又乱又难改。这次我把数据、排序、装载、输入输出分开写,每个类只做一件事,代码清晰很多,调试 bug 也更快。其次,我学会了面向对象的基本思想:用类表示现实事物(航班、货舱、货物),用方法表示它们的行为(装货、查货、算重量),让程序结构更贴近现实逻辑。在编写过程中,我也发现了自己的不足:最开始不会设计类结构,逻辑混乱;对 “一对多” 关系理解不深,经常漏写集合遍历;输出格式容易写错,需要反复对照题目要求。通过不断调试和修改,我不仅掌握了类设计、集合使用、排序算法,还养成了先理清结构再写代码的习惯。这次作业让我明白,好代码不是 “能运行就行”,而是结构清晰、易于阅读、方便修改。最重要的一点是阅读任务时需要小心谨慎,不能再像这次一样因为少写一个类扣了40分
2.3 作业集3解读
以下图是SourceMonitor 报表截图
![image]()
该题目一共设计了12个类,最大圈复杂度为10,平均圈复杂度为1.87
以下图是作业三的类图
![屏幕截图 2026-05-18 172438]()
类作用及关系: - Luggage(行李类)
存储行李重量,提供获取重量的方法。
仅作为旅客的附属数据,不参与复杂逻辑。 - Passenger(旅客类)
代表一名旅客,包含姓名和行李。
计算单人总重量 - Position(位置类)
表示货舱内的存储位置(行、列)。
用于格式化输出位置信息。 - Cargo(货物类)
存储货物信息:编号、名称、重量、目标货舱id
纯数据载体,供装载与统计使用。 - CargoCompartment(货舱类)
管理货舱编号、最大载重、力臂、存储位置、货物列表。
提供装货、判断载重、计算当前重量的功能。 - LoadDispatcher(调度工具类)
提供货物按编号升序排序的功能。
仅负责排序,不做装载操作。 - CargoLoader(货物装载类)
核心业务类:排序货物、尝试装载、判断货舱是否超载。
超载时输出警告,是整个装载流程的控制中心。 - Flight(航班类)
系统核心容器,管理货舱、旅客、总重量。
提供查找货舱、统计载重、存储各类数据的统一入口。 - InputValidator(输入校验类)
纯工具类,校验输入数字是否合法、是否在范围之内。
防止非法数据导致程序崩溃。 - WeightBalanceCalculator(重心计算类)
计算总重量、总力矩、实际重心、重心百分比。
判断重心是否在安全范围。 - WeightBalanceResult(重心结果类)
封装计算结果:旅客总重、总力矩、重心、重心百分比、是否安全。
方便主程序直接读取并打印。 - Main(主类)
程序入口,接收输入、创建对象、调用业务、输出完整舱单。
Flight 包含多个 CargoCompartment(一对多)
Flight 包含多个 Passenger(一对多)
CargoCompartment 包含多个 Cargo(一对多)
CargoCompartment 包含多个 Position(一对多)
Passenger 包含一个 Luggage(一对一组合)
CargoLoader 依赖 Flight、Cargo、LoadDispatcher
WeightBalanceCalculator 依赖 Flight 完成重心计算
Main 调用并依赖所有类(程序总入口)
个人学习体会
通过多个类的分工协作完成了旅客管理、货物装载、载重校验、重心计算、配平评估等完整功能。同时我也熟练掌握了数据联动运算思路,懂得结合固定常量参数与动态录入数据完成复合公式计算,不再只会完成简单单一数值运算,面对带有物理运算逻辑的程序编写更加得心应手。在输入处理方面,我养成了前置数据校验的编写习惯,不再放任随意数据录入,有效提升了程序运行稳定性与容错能力。
在流程把控上,我理清了项目自上而下的运行顺序,能够提前梳理好数据录入、数据整理、业务执行、结果输出四大流程,编写代码前先梳理运行逻辑,大幅减少后期返工修改的次数。面对多条件分支判断时,我能够清晰划分不同异常场景与正常场景,精准匹配对应的提示语句与执行逻辑,让程序反馈更加贴合实际使用需求。
调试程序的过程里,我学会了针对性排查数据统计错误、顺序错乱、数值溢出等常见问题,积累了不少实战排错经验。除此之外,我也意识到规范命名与统一代码格式的重要性,清晰的命名能够大幅提升代码可读性,后续回看修改代码时更加便捷。
此次作业也暴露出我自身存在不少短板,在复杂公式代码精简编写上还有所欠缺,部分运算代码写法偏繁琐,代码精简优化能力不足。同时在多模块协同调试时,偶尔会出现数据传递错位的问题,对于不同类之间的数据传递把控还不够细致。后续学习中,我会多练习复合型业务程序编写,多研读精简代码写法,强化数据流转逻辑思维,进一步提升自己综合编码能力,让编写的程序不仅可以正常运行,还能做到简洁高效、实用性更强。
总结
完成这三次作业后,我能清晰感受到自己的变化:从只会写零散的语法练习,到能独立设计并实现一个功能完整的小型系统,整个过程虽然磕磕绊绊,但收获远比预期多。最开始我只是照着模板写简单的类和方法,后来慢慢接触到真实的业务逻辑,最后能把货舱、旅客、货物、重心计算这些模块整合到一起。
1 收获与成长
在知识层面,我不再只停留在 “能写出语法正确的代码”,而是真正学会了用类和对象去建模问题。从最初的货物、航班基础类,到后面货舱、旅客、行李、重心计算的完整体系,我逐渐明白如何把现实中的场景抽象成代码结构,也开始理解类与类之间的关系不是凭空定义的,而是服务于业务逻辑的。
同时,我也对数组、集合等容器的使用有了更清晰的认识,不再是看到集合就直接用,而是会思考哪种数据结构更适合当前场景,哪种方式更方便后续扩展。此外,通过一次次调试、改错、重构,我慢慢养成了更规范的编码习惯。
2 不足与待提升
虽然三次作业都顺利完成,也通过了所有测试点,但我也清楚自己还有不少短板。比如,我对设计模式的接触还很浅,虽然代码按功能拆分成了不同类,但离真正的分层、解耦、模块化还有不小距离。面对稍微复杂一点的业务逻辑时,我还是习惯把判断和流程堆在一起,离 “高内聚、低耦合” 的要求还差得远。
另外,在性能优化、代码复用这些方面,我也只是刚刚入门,还停留在 “能实现” 的阶段,离 “写得高效、写得简洁” 还有很大提升空间。像单元测试、异常体系设计这些偏工程化的能力,我目前接触得还很少,这些都是后续需要系统学习和练习的内容。
3 课程与作业改进建议
整体来看,三次作业的安排是合理的,难度由浅入深,循序渐进,不会让人一开始就觉得无从下手。作业内容也很贴近真实业务,不仅练语法,更重要的是让我学会了分析问题、拆解问题、设计方案的能力。
结合自己的学习过程,我也有几点小建议:
可以在每次作业发布前,多给一些设计思路的引导,比如类结构的划分方式、关键模块的实现思路,帮助我们更快找到设计方向;
课堂上可以多展示一些优秀的作业代码示例,让我们能直观地感受到 “规范、易维护的代码” 是什么样的;
平时可以适当增加一点代码互评的环节,同学之间互相指出不足,既能发现自己看不到的问题,也能互相学习不同的实现方式;
最后,题目里给出的样例和实际测试用例的出入不要太大,不然很容易一开始就摸不着方向,调试起来也很费劲。虽然但是,这样写出来的成就感确实更足。





浙公网安备 33010602011771号