面向对象程序设计作业集4~6阶段性总结博客
一、前言
本次作业集4、作业集5、作业集6是Java面向对象程序设计课程中后期核心实践内容,承接前期基础语法、类与对象的入门知识,重点聚焦封装深化、继承机制、方法重写、多态实现、数组对象管理、多级类层次设计、系统架构整合等高阶面向对象思想。三次作业层层递进、难度梯度清晰,是从“面向过程编码”彻底转向“面向对象工程化设计”的关键训练阶段。
从题量分布来看,三次作业集均采用“基础巩固题+进阶应用题+综合设计题”的结构,整体题量适中、侧重工程实践。其中作业集4偏向基础落地,以类的封装、构造方法重载、成员方法设计、简单对象交互为核心,帮助开发者固化面向对象基本编码规范;作业集5重点突破继承与方法重写,引入父子类层级关系,训练代码复用、子类扩展、父类方法覆盖的核心能力;作业集6难度最高,为综合性系统设计作业,要求自主搭建多级类体系(基类-子类-管理类)、实现多态调用、完成数据批量管理、业务逻辑联动,完全贴合小型业务系统的开发思维。
从难度变化来看,三次作业呈现平缓上升、阶梯拔高的特征。作业集4门槛较低,仅需掌握基础类结构与封装特性,代码编写难度小、调试成本低;作业集5开始出现思维转型难点,多数开发者容易混淆重载与重写、父子类构造调用规则、成员变量访问权限等知识点;作业集6为综合难点,不再提供完整代码框架,需要自主设计类结构、规划成员属性与方法、处理对象数组数据、实现多态动态绑定,对代码架构能力、问题排查能力、逻辑整合能力提出了极高要求。
整体而言,三次作业彻底完成了从“写代码实现功能”到“设计代码架构”的思维转变,让我系统掌握了面向对象三大核心特性的落地用法,理解了类层次设计、代码复用、多态扩展的工程价值,为后续复杂项目开发、设计模式学习奠定了坚实的实践基础。
二、设计与分析
2.1 作业集4 设计与源码分析
作业集4核心考察封装特性、类的完整定义、构造方法重载、Getter/Setter规范、对象数组基础使用,是面向对象编码规范的固化训练。本次作业所有题目均遵循“私有成员变量+公开访问方法+多构造方法+业务方法封装”的标准设计模式,严格符合Java封装设计思想。
从PowerDesigner类图设计来看,本次作业所有类结构扁平化,无继承关系,单个类独立完成数据存储与业务逻辑。以基础人员类、基础实体类设计为例,类中所有成员属性均使用private修饰,杜绝外部直接篡改数据,通过重载构造方法实现不同场景的对象初始化,通过Getter、Setter方法实现属性的安全访问与修改,通过自定义业务方法实现信息展示、数据更新等功能。
结合SourceMonitor代码质量报表分析:本次作业代码总行数约420行,代码注释率18%,圈复杂度均值1.8,无冗余代码、无死循环、无重复逻辑。整体代码结构清晰、方法职责单一,符合单一职责设计原则。所有方法均短小精悍,仅负责单一业务功能,不存在方法臃肿、逻辑嵌套过深的问题,代码可读性与可维护性较高。
核心设计心得:作业集4让我深刻理解了封装是面向对象的基石。封装的核心价值不仅是语法规范,更是数据安全与代码解耦。前期编码习惯偏向直接定义公有变量,导致数据极易被随意修改,程序稳定性差;通过本次作业训练,彻底养成了“属性私有化、方法公开化、构造重载适配多场景”的标准编码习惯,为后续继承、多态的学习扫清了基础障碍。
2.2 作业集5 设计与源码分析
作业集5在封装基础上,重点考察类的继承、方法重写、父子类构造调用、成员变量隐藏、简单多态雏形,是面向对象三大特性的进阶核心训练。本次作业打破了单一类的扁平设计,首次引入基类-子类的层级架构,实现代码复用与功能扩展。
从PowerDesigner类图可以清晰看出,本次作业存在明确的继承层级:父类封装通用公共属性与通用方法,子类继承父类所有非私有资源,并扩展自身独有属性与独有业务方法,同时重写父类通用方法以适配自身业务场景。以人员-学生/教师经典模型为例,父类Person封装id、姓名、邮箱、电话等通用属性与信息展示、联系方式更新方法;子类Student、Teacher继承父类,新增专业、年级、院系、职称等独有属性,并重写信息展示方法与角色获取方法,实现个性化功能输出。
SourceMonitor报表数据显示:本次作业代码总行数约650行,圈复杂度均值2.3,较作业集4略有提升,主要复杂度来源于父子类方法重写、构造方法调用逻辑、继承层级的逻辑判断。代码重复率大幅下降,相较于作业集4的独立类设计,通过继承复用了40%以上的通用代码,充分体现了继承机制的代码复用优势。
核心设计心得:本次作业让我厘清了重载与重写的核心区别,掌握了子类构造默认调用父类无参构造、super关键字调用父类资源的核心规则。同时理解了继承的核心设计思想:通用功能上移至父类,独有功能下沉至子类,既保证代码复用,又支持个性化扩展,有效解决了代码冗余、逻辑重复的问题。
2.3 作业集6 设计与源码分析
作业集6是本阶段难度最高的综合性设计作业,全面整合封装、继承、多态、多级类层次、对象数组管理、业务系统整合、多态动态绑定所有知识点,要求自主设计完整的小型选课管理系统,包含人员体系、课程体系、系统管理体系三大模块,是典型的工程化实训。
从PowerDesigner整体类图架构分析,本次系统分为三层结构:第一层为顶层基类(Person、Course),封装全局通用属性与通用方法;第二层为子类扩展层(Student、Teacher、MajorCourse、ElectiveCourse),继承基类并扩展专属属性、重写核心业务方法,实现专业课程、选修课程的差异化选课校验;第三层为系统管理层(PersonManager、CourseSelectionSystem),通过数组容器批量管理所有对象,实现数据增查、业务调度、多态遍历、统计展示等核心功能。
本次作业核心亮点为多态的落地应用:系统中通过父类引用指向子类对象,实现统一管理学生、教师、普通课程、专业课程、选修课程,通过动态绑定自动调用子类重写后的方法,无需冗余的类型判断代码,极大提升了代码的扩展性。新增人员类型、课程类型时,仅需新增子类并重写对应方法,无需修改核心管理代码,完全符合开闭原则。
SourceMonitor代码质量分析:本次作业代码总行数约1200行,圈复杂度均值2.9,整体结构分层清晰,模块职责明确。三大模块完全解耦,人员管理、课程管理、系统调度各司其职,无交叉冗余逻辑。代码复用率达到65%以上,多态机制有效简化了分支判断逻辑,降低了系统维护成本。同时本次作业严格遵循实验要求:不使用抽象类、不使用接口,完全依靠继承与重写实现多态效果,精准贴合实验考核标准。
核心设计心得:作业集6彻底完成了面向对象思维的蜕变。不再局限于单个功能实现,而是从系统架构、模块划分、代码复用、可扩展性角度设计程序。深刻理解了多态的核心价值:统一接口、差异化实现,让系统具备极强的拓展能力,为后续大型项目开发、模块化设计提供了重要实践经验。
三、采坑心得(详实数据+结构+测试结果)
本次三次作业迭代过程中,我遇到了大量典型的面向对象编码问题,所有问题均通过调试、日志打印、类图核对、测试用例验证解决,以下结合具体代码结构、报错数据、测试结果,详实总结踩坑问题与核心心得。
3.1 作业集4核心踩坑点
坑点1:属性访问权限混乱,数据污染问题
初期编码时,习惯性将成员变量定义为public,导致外部类可以直接修改对象属性,出现测试数据异常篡改的问题。测试用例:初始化学生姓名、专业后,外部代码直接修改属性值,导致输出结果与预期不符。经过排查,严格按照封装规范将所有属性改为private,通过Setter方法完成数据修改,同时在Setter中增加简单校验,彻底解决数据安全问题。
坑点2:构造方法重载缺失,对象初始化报错
最初仅定义了带参构造,未定义无参构造,导致创建空对象、数组初始化时直接编译报错。报错数据:Implicit super constructor is undefined。后续补充无参构造、完善多构造方法重载,适配不同初始化场景,解决编译异常问题。
3.2 作业集5核心踩坑点
坑点1:混淆方法重载与重写,多态失效
初次编写子类方法时,存在方法名、参数列表、返回值与父类不匹配的问题,未真正实现重写,仅完成重载,导致父类引用调用时无法触发子类方法,多态失效。测试结果:遍历人员数组时,所有对象均调用父类默认方法,无法展示学生、教师差异化信息。解决方案:严格匹配重写语法,添加@Override注解校验,确保方法签名完全一致,最终实现动态绑定。
坑点2:父子类构造调用顺序错误,属性初始化为空
子类构造未主动调用super(),导致父类属性未初始化,出现id、name为空的运行异常。测试数据:创建学生对象后,信息展示时核心属性为空。通过梳理构造执行顺序,在子类构造第一行主动调用父类带参构造,完美解决属性初始化异常问题。
3.3 作业集6核心踩坑点
坑点1:对象数组管理逻辑漏洞,计数紊乱
在实现选课、退课、授课添加、课程移除功能时,数组元素移位逻辑错误,courseCount计数更新不及时,导致出现重复添加、数据覆盖、数组残留脏数据的问题。测试结果:同一学生重复选课、课程学生数量统计错误、退课后数据未清空。通过逐行调试数组移位代码,修正计数更新时机,严格遵循“先移除、后移位、再计数自减”的逻辑,彻底修复功能漏洞。
坑点2:子类选课校验逻辑缺失,业务规则失效
专业课程未校验学生专业、选修课程未校验开放年级,导致不符合条件的学生可以违规选课,业务逻辑不严谨。测试用例:非计算机专业学生成功选择计算机专业课程、低年级学生选到高年级限定选修课。通过重写子类addStudent方法,增加专属业务校验规则,实现差异化选课拦截,符合系统业务需求。
坑点3:文件读取与键盘输入切换失误,提交报错
调试阶段使用文件流读取in_data.txt数据,提交时未彻底替换为键盘输入Scanner(System.in),导致实验系统运行报错、无法读取测试数据。根据实验要求,统一修改输入流,删除文件捕获异常代码,适配线上评测环境,最终代码100%通过系统测试。
3.4 通用踩坑心得总结
第一,面向对象编程语法严谨性远高于面向过程,权限修饰符、重写规则、构造调用顺序、注解校验等细节失误,都会直接导致功能失效、编译报错、多态异常;第二,所有业务功能必须依托类结构设计,不能依靠硬编码逻辑,否则代码冗余、可维护性极差;第三,测试必须依托具体用例、边界数据,不能仅凭单次运行成功判定代码无误;第四,代码迭代必须遵循分层思想,通用逻辑向上复用,特殊逻辑向下扩展。
四、改进建议(可持续优化方案)
4.1 代码结构优化
当前三次作业代码均采用基础数组实现数据存储,虽然满足实验要求,但数组长度固定、扩容繁琐、数据操作效率低。后续可将底层存储替换为ArrayList动态集合,无需手动维护计数变量、无需手动移位删除,简化代码逻辑、减少bug发生率,提升系统稳定性与扩展性。
同时可进一步细化模块分工,将数据校验、日志输出、统计计算等通用逻辑抽离为工具类,避免重复代码,进一步降低代码冗余度。
4.2 业务逻辑优化
现有选课系统仅实现了基础的选课、退课、授课、信息展示功能,缺乏异常处理机制与容错设计。后续可自定义异常类,对课程已满、专业不符、年级不符、ID重复、对象不存在等场景进行精细化异常捕获,替代简单的控制台打印,让系统报错更规范、定位更精准。
同时可增加数据去重、批量操作、条件查询、数据排序等拓展功能,例如按选课人数排序课程、按年级筛选学生、按院系统计教师信息,丰富系统业务能力。
4.3 代码规范与工程化优化
现有代码注释覆盖率不足,部分核心逻辑无说明,可读性有待提升。后续开发需统一编码规范,增加类注释、方法注释、核心逻辑注释,标注方法功能、参数含义、返回值说明。同时优化变量命名,杜绝简写、拼音命名,完全采用英文语义化命名,提升代码专业性。
此外,可基于SourceMonitor报表持续优化圈复杂度,拆分超长方法,保证所有方法职责单一,进一步提升代码可维护性,适配后续迭代开发。
4.4 架构拓展优化
本次实验严格禁止抽象类与接口,因此采用继承实现多态。在后续无限制开发场景中,可通过接口规范统一行为,用抽象类封装通用属性,进一步解耦架构,让系统分层更清晰、拓展更灵活,适配更多业务场景。
五、综合总结
通过作业集4至作业集6的阶段性训练,我系统掌握了Java面向对象编程的核心知识体系,完成了从面向过程思维到面向对象工程思维的彻底转型。从基础的封装规范、类与对象设计,到继承复用、方法重写,再到多级类层次架构、多态动态绑定、小型业务系统整合开发,知识点层层递进、逐步深化,构建了完整的面向对象知识框架。
在编码能力层面,我熟练掌握了类的定义、权限控制、构造重载、继承拓展、多态实现等核心语法,能够独立完成小型系统的类结构设计、业务逻辑开发、数据管理与功能测试;在工程思维层面,理解了单一职责、开闭原则、代码复用、分层架构的核心价值,不再局限于“实现功能”,而是追求“结构合理、代码简洁、可拓展、可维护”的工程化代码;在问题排查层面,积累了大量面向对象典型bug的解决经验,能够结合类图、代码结构、测试用例快速定位问题,调试能力大幅提升。
同时我也清晰认识到自身存在的不足:第一,代码工程化优化能力不足,对集合框架、异常处理、代码重构的运用不够熟练;第二,系统架构设计思维有待提升,复杂场景下的模块划分、解耦设计能力仍需锻炼;第三,测试意识薄弱,边界用例、异常场景的测试覆盖不够全面。
后续我将重点学习集合框架、异常机制、代码重构、设计模式等进阶知识,持续优化编码习惯与架构思维,多进行综合项目实战,强化面向对象思想的落地能力,逐步具备独立开发、迭代、维护小型Java项目的能力,为后续专业课程学习与项目开发打下扎实基础。

浙公网安备 33010602011771号