8-9集训题
一、前言
在 Java 进阶学习中,8 - 9 题目集和 5 - 7 题目集的练习内容差别很大。5 - 7 题目集主要练习类与类之间的关系,还涉及一些算法,做起来比较困难。8 - 9 题目集主要围绕继承和多态展开,不少题目是在之前的基础上进行重构,代码实现难度比 5 - 7 题目集低一些。不过,在设计类的时候,需要考虑的东西更多,要确定父类有哪些属性和方法,子类又有哪些特殊方法。有时候光是理解题目、设计类图就要花很多时间,但也因此,我的类设计能力得到了锻炼。
| 题目数量 | 难度 | 知识点 | |
| 题目集8 | 3题 | 适中 | 继承与多态 |
| 题目集9 | 3题 | 适中 | 继承与多态 |
二、设计与分析
(1)NCHU_点线面问题重构(继承与多态)
题目主要在上次的基础上新增Element类和Plane类。使得点Point类、线Line类和面Plane类都继承于Element类。
我的类图

类设计
Main类:执行程序
Point类:属性(x:横坐标,y:纵坐标),方法(构造方法、get set方法和输出点信息的方法)。
Line类:属性(两个点Point类对象和颜色),方法(构造方法、get set方法、返回线长度和输出线信息的方法)。
Plane类:属性(颜色)。方法(构造方法、get set方法和返回面信息的方法)。
Element类:一个抽象类,有着display()抽象方法。是Point类、Line类和Plane类。
SourceMontor分析结果:



分析
该代码整体复杂度适中(平均 1.39),代码嵌套较深(最大 3 层),注释率仅 2.1%。
心得
这道题难度适中,却让我初步踏入了继承与多态编程的领域,为后续航空货运管理系统的设计筑牢了基石。
(2)NCHU_雨刷程序功能扩展设计
题目主要在上次的基础上,新增了一个高级雨刷系统,实现对功能的扩展。需要做好类设计,方便扩展功能。
我的类图:

类的设计:
Main类:执行程序。
Lever类:是一个抽象类。属性(控制杆的挡位和挡位所对应的名称)。方法(构造方法、get set方法、升档和降档方法)。
Lever1类:低级控制杆。继承Lever类。在构造方法中对挡位所对应的名称进行赋值,重写了升档方法。
Lever2类:高级控制杆。继承Lever类。在构造方法中对挡位所对应的名称进行赋值,重写了升档方法。
Dial类:是一个抽象类。属性(刻度盘的刻度)。方法(构造方法和get set方法)。
Dial1类:低级刻度盘。继承Dial类。方法(构造方法,重写了升刻度的方法)。
Dial2类:高级刻度盘。继承Dial类。方法(构造方法,重写了升刻度的方法)。
Brush类:属性(速度)。方法(构造方法和get set方法)。
Agent类:是一个抽象类。属性(控制杆对象,刻度盘对象和雨刷对象),方法(构造方法、get set方法和计算雨刷速度的抽象方法)。
Agent1类:低级雨刷系统,继承Agent类。实现了计算雨刷速度的方法。
Agent2类:高级雨刷系统,继承Agent类。实现了计算雨刷速度的方法。
SourceMontor分析结果:



分析
该代码整体复杂度适中(平均 2.20),代码嵌套较深(最大 5 层),注释率 4.1% 偏低,方法平均长度合理(4.73 行)。
心得
这道题让我对继承和多态有了更深入的理解。做题时,我花了很多时间思考如何分别设计两个雨刷系统,计算方法该放在哪里,以及两个系统的计算方法是否需要合并编写。相比点线面那道题,这道题的继承和多态情况更复杂,有助于进一步理解和运用继承多态。
(3)NCHU_航空货运管理系统(类设计)
题目对类设计的要求很高,难度不小。
我的类图


类的设计:
Main类:执行程序。
Control类:属性(订单对象),方法(接收并处理信息、判断重量是否满足要求和输出订单信息方法)。
Person类:是一个抽象类。属性(名字、电话号码和地址),方法(构造方法、get set方法和输出信息的抽象方法)。
Customer类:继承Person类。新增了id属性,重写了show()方法。
Sender类:继承Person类。重写了show()方法。
Recipient类:继承Person类。重写了show()方法。
Goods类:属性(编号、名字、长度、宽度、高度和重量),方法(构造方法、get set方法和计算货物体积重量的方法)。
Shipment类:属性(发件人对象,收件人对象,航班对象),方法(构造方法、get set方法)。
Flight类:属性(航班号、起飞机场、降落机场、航班日期和最大载重量),方法(构造方法和get set方法)。
PaymentMethod类:是一个抽象类。有一个支付的抽象方法。
WeChatPay类:继承PaymentMethod类。重写了支付方法。
Alipay类:继承PaymentMethod类。重写了支付方法。
Order类:属性(编号、日期、客户信息、运输信息、货物信息、总重量和总金额)。方法(构造方法、get set方法、返回总重量和返回总金额的方法)。
GoodsDetail类:属性(货物信息、计费重量、计费费率和应交运费)。方法(构造方法、get set方法、计算重量、计算费率、计算运费和显示信息的方法)。
SourceMontor分析结果:




分析
该代码整体复杂度较低(平均 1.18),代码嵌套深度适中(最大 3 层),注释率 7.7% 仍有提升空间,方法平均语句数合理(3.27 条)。
心得
这道题在类设计上花费了较多精力,难点也集中在类设计部分。实践表明,预先规划好类图能极大提升开发效率 —— 完成类图设计后,代码编写过程会变得流畅高效。通过这道题,我深刻体会到编程前做好类设计的重要性:若未经过系统设计便直接编码,边敲代码边构思类结构,不仅效率低下,还可能因后期类图调整导致前期代码大量返工(白写几十行代码,白花费几十分钟谁受得了啊),甚至需要重新编写大部分内容。这一过程让我认识到,清晰的类设计能够有效避免这些问题。
(4)NCHU_魔方问题
这道题已经给出了类图,主要是考察代码的实现。
我的类图

类的设计
Main类:执行程序。
Solid类:是一个抽象类,有着返回体积和表面积的抽象方法。
RegularPyramid类:继承Solid类,重写了父类的get set方法,实现了父类的抽象方法。
Cube类:继承Solid类,重写了父类的get set方法,实现了父类的抽象方法。
RubikCube类:是一个抽象类,属性(颜色、阶数和Solid类对象),方法(构造方法、get set方法、返回面积和返回体积的抽象方法)。
SquareCube类:继承RubikCube类,实现了父类的抽象方法。
RegularPyramidCube类:继承RubikCube类,实现了父类的抽象方法。
SourceMontor分析结果:



分析
该代码整体复杂度极低(平均 1.00),但注释率仅 0.5%,7 个类平均每个类 4.86 个方法,方法平均仅 1.24 条语句。
心得
有了题目集8的基础,这道题完成得较为轻松,过程中也很好地巩固了继承与多态的运用。需注意代码注释率仅0.5%(忘记注释了),真的太低了,后续练习中务必对基础方法和类添加注释,养成良好的注释习惯,以提升代码可读性与可维护性。(真的能养成吗?下次一定)
(5)NCHU_点线面问题再重构(容器类)
这道题主要是添加了容器类,运用ArrayList集合。
我的类图

类的设计
主要是在NCHU_点线面问题重构(继承与多态)的基础上添加了一个集合类。
GeometryObject类:属性(集合对象),方法(添加元素和删除元素)。
SourceMontor分析结果:



分析
该代码整体复杂度极低(平均 1.00),所有方法复杂度均为 1,嵌套深度浅(最大 2 层),7 个类职责清晰,方法简短。
心得
这道题完成得很顺利,只需添加集合类并修改 main 方法即可通过测试点。过程中练习了集合自带方法,真切感受到 Java 集合的便利,与上学期 C 语言体验截然不同。Java 的便捷性让编程更高效,其类库也提供了快捷的方法,确实带来了更轻松的编程感受。
(6)NCHU_航空货运管理系统(继承与多态)
这题是在NCHU_航空货运管理系统(类设计)的基础上,扩展了客户类型、货物类型和支付方式。
我的类图



类的设计
Main类:执行程序。
Control类:属性(订单对象),方法(接收并处理信息、判断重量是否满足要求和输出订单信息方法)。
Person类:是一个抽象类。属性(名字、电话号码和地址),方法(构造方法、get set方法和输出信息的抽象方法)。
Customer类:继承Person类,并且是一个抽象类。新增了编号和折扣属性,重写了show()方法。
Individual类:继承Customer类,有一个构造方法。
Corporate类:继承Customer类,有一个构造方法。
Sender类:继承Person类。重写了show()方法。
Recipient类:继承Person类。重写了show()方法。
Goods类:属性(编号、名字、长度、宽度、高度和重量),方法(构造方法、get set方法和计算货物体积重量的方法)。
Shipment类:属性(发件人对象,收件人对象,航班对象),方法(构造方法、get set方法)。
Flight类:属性(航班号、起飞机场、降落机场、航班日期和最大载重量),方法(构造方法和get set方法)。
PaymentMethod类:是一个抽象类。有一个支付的抽象方法。
WeChatPay类:继承PaymentMethod类。重写了支付方法。
Alipay类:继承PaymentMethod类。重写了支付方法。
Cash类:继承PaymentMethod类。重写了支付方法。
Order类:属性(编号、日期、客户信息、运输信息、货物信息、总重量和总金额)。方法(构造方法、get set方法、返回总重量和返回总金额的方法)。
GoodsDetail类:是一个抽象类,属性(货物信息、计费重量、计费费率和应交运费)。方法(构造方法、get set方法、计算重量、计算费率、计算运费和显示信息的方法)。其中计算费率是抽象方法。
Normal类:继承GoodsDetail类,实现了计算费率的方法。
Dangerous类:继承GoodsDetail类,实现了计算费率的方法。
Expedite类:继承GoodsDetail类,实现了计算费率的方法。
SourceMontor分析结果:




分析
该代码整体复杂度适中(平均 1.39),代码嵌套深度中等(最大 4 层),注释率 6.5% 仍偏低,类设计上 17 个类职责较清晰,方法平均语句数 3.61 较合理。
心得
在本次题目迭代开发中,前期类设计的合理性对开发效率影响显著。若严格遵循 Java 七大设计原则(如开闭原则、单一职责原则等)完成类结构的清晰设计,本次迭代仅需新增扩展类,无需大规模修改原有代码即可便捷实现功能扩展。
三、采坑心得
(1)在NCHU_航空货运管理系统(类设计)题目中没有理解好题目中没有理解计算总重量的方法是计费重量的和还是设计重量的和,导致了答案错误,浪费了不少时间。
(2)在NCHU_航空货运管理系统(类设计)题目中没有注意超重时的输出语句,导致了答案错误。
(3)在NCHU_航空货运管理系统(继承与多态)题目中没有想清楚应该怎么扩展,就开始编写代码。导致大量代码需要返工。
四、改进建议
(1)目前代码注释太少不利于理解,在后续的改进过程应该增加注释。
(2)对继承与多态还不够掌握,后续应该多加练习。
(3)在进行类设计时,思路不够清晰,思考时间较长。可以去寻找与面向程序有关的题目进行类设计,再与答案的类设计进行比较。
(4)在扩展新的功能时,不知道该在哪些类上进行扩展。后续应该加强对扩展的掌握。
五、总结
(1)学习到的内容
通过这两次的题目集的训练,我加深了对继承与多态的理解,能够对简单题目进行类设计,也可以对其进行简单的迭代,扩展新的功能。初步认识到java七大原则的重要性,它们在这次题目集中有了很好的体现,迭代的前提就涉及到了单一职责原则等等。
(2)仍需学习和提升的地方
-
- 在类设计方面花的时间比较长,需要锻炼类设计的能力
- 在扩展功能方面,有时因为对功能的理解不是很透彻,导致设计有问题。应该去观看相应的教学视频,提高能力
- 在编写父类时,并不能很好的确定什么方法应该存在父类中,什么方法应该在父类直接编写完成,导致有时子类会存在重复的代码。需要提高对继承的理解。
(3)建议和意见
-
- 希望老师在实验方面的要求更清晰一点,对输出结果进行一些规定。
浙公网安备 33010602011771号