NCHU第三次Blog作业
前言:
Blog作业:总共满打满算是写了2次(不包括这次)Blog作业的,两次的作业都是对往期pta作业的较难题目进行复盘和总结。也正因为如此,每次的blog作业都能够让我重新回顾自己的不足之处以及总结自己哪里还需要加强。所以Blog是我觉得非常好的一个作业,频率也合适,很适合我这种小白。
PTA作业:几乎每周都会发布的pta作业可以说是家常便饭了。但是每次作业的难度都大相径庭,你不知道哪次作业会很简单或者很难,当时前面几周出来的魔鬼电梯真的是让你面露难色,连着几周都是这个作业让我很难受,根本做不出来。然后就是接下里的几周作业都还好,难度适中,可以接受,既不会做不出来,又有足够的挑战性,做完有成就感。所以未来的PTA也请保持下去吧,不仅可以让我学到东西,也让我充满挑战的心。当然也请将难度控制在一个可以接受的范围。
实验:几次的实验都是迭代题目,都是将大象装进冰箱。难度逐渐上升,还是不错的练习。但是有一个必须吐槽的就是实验提交系统。里面的代码要求手敲进去,但是我请问这真的有意义吗。如果是老师想让我们温习一下,更加熟悉自己的实验代码,我觉得不如让我们去写一份实验blog或许更有效,这样手敲进去真的很浪费时间。希望以后不会有这样的东西了,拜托拜托。
线上课程:线上的学堂在线课程我觉得还是不错的,老师讲的不错,有相应的代码演示还有相应的练习来巩固,难度是偏简单的,但是里面的练习有的很变态,答案只是差一个字或者两个答案的换个顺序都判错误。
线下课程:线下的课程我觉得很难,老师几乎不讲基础的东西,上课没几节就直接开始用java写链表,让我很难绷,然后上课也是直接用所学直接做东西,对于我这种笨蛋真的很难接受。
希望以后会简单一点吧
面向对象技术总结:
- 一、封装:数据的守护者
在学习封装的过程中,PTA 作业和实验起到了关键作用。最初接触封装概念时,通过将类的属性私有化,并提供公共的访问方法(getter 和 setter),我明白了封装的本质是隐藏对象的内部实现细节,只对外暴露必要的接口。
在 PTA 作业中,有一道题目要求设计一个学生类,包含姓名、年龄、成绩等属性。我将这些属性都设置为私有,避免外部直接访问和修改,然后通过 getter 和 setter 方法来获取和设置属性值。在这个过程中,我不仅学会了如何正确封装属性,还深刻体会到封装带来的好处。例如,在 setter 方法中可以添加数据验证逻辑,保证数据的合法性。比如在设置学生年龄时,可以添加判断条件,确保年龄在合理范围内,如果输入不合法,可以抛出自定义异常或者赋予默认值,这极大地增强了程序的健壮性和安全性。
通过实验,我进一步巩固了封装的应用。在 “大象进冰箱” 实验中,我设计了电器类和动物类。将电器的容积、承重等属性,以及动物的体积、攻击力等属性进行私有化封装,并提供对应的访问方法。例如,在设置动物攻击力的 setter 方法中,加入了数值范围校验,若输入的攻击力为负数则赋予默认值。这样一来,系统的各个模块之间的耦合度降低,每个类只需要关注自身的职责,外部模块只能通过规定的接口来操作动物和电器的对象,这使得系统的维护和扩展变得更加容易。
然而,在复杂的项目场景中,我发现自己对封装的理解还不够深入。有时候难以准确判断哪些属性应该封装,哪些方法应该暴露给外部调用。在一些涉及多个类交互的业务逻辑中,封装的边界划分不够清晰,导致代码的可读性和可维护性受到一定影响,这是我在后续学习中需要重点改进的地方。 - 二、继承:代码复用的桥梁
继承是面向对象编程中实现代码复用的重要机制,通过 PTA 作业和实验,我对继承有了较为深刻的认识。在学习继承时,通过创建一个父类和多个子类的形式,子类可以继承父类的属性和方法,避免了重复编写相同的代码。
在 PTA 作业中,涉及图形类的相关题目很好地锻炼了我对继承的运用。以抽象类AbstractShape为基础,Rectangle类作为其直接子类,继承了AbstractShape的属性和方法,并添加了属于矩形特有的宽度width和长度length属性;Box类又继承自Rectangle类,在继承矩形属性的同时,新增了高度height属性以描述立方体的特征。通过这种层次化的继承关系,代码的复用性得到了极大提高,同时也清晰地体现了面向对象编程的层次结构。
在 “大象进冰箱” 实验里,我以电器类作为父类,微波炉类、冰箱类、洗衣机类继承电器类;以动物类作为父类,老虎类、狮子类、大象类继承动物类。子类继承父类的基本属性和行为后,又根据自身特点进行了扩展。比如冰箱类继承电器类后,额外添加了制冷温度等属性;老虎类继承动物类后,强化了攻击力相关的方法。通过继承,我们避免了在子类中重复编写父类已有的代码,同时又能根据子类的特殊需求进行扩展,使得代码结构更加清晰,维护起来更加方便。
但在使用继承时,我也遇到了一些问题。有时候过度使用继承,导致类的层次结构过于复杂,难以理解和维护。而且在重写父类方法时,容易出现方法签名不一致等错误,导致程序运行出现异常。这说明我对继承的使用原则和规范还没有完全掌握,需要进一步加强学习和实践。 - 三、多态:同一接口,多种形态
多态是面向对象编程中非常重要的特性,它使得程序具有更强的灵活性和扩展性。在 PTA 作业中,关于图形类的题目让我对多态有了深入实践。AbstractShape类作为抽象父类,定义了getArea()和show()等抽象方法,Rectangle类、Circle类等子类继承AbstractShape类后,根据自身图形的特性重写getArea()方法。例如,Rectangle类通过长和宽计算面积,Circle类通过半径计算面积 ,在实际调用getArea()方法时,程序会根据对象的实际类型执行相应子类的方法,这就是多态的体现。通过这种方式,程序可以更加灵活地处理不同类型的图形对象,提高了代码的通用性。
在 “大象进冰箱” 实验中,多态也发挥了重要作用。我定义了一个 “进入” 的抽象方法在电器类中,然后在微波炉类、冰箱类、洗衣机类中分别重写该方法,以体现不同电器容纳动物的规则差异;在动物类中定义了 “比较” 抽象方法,老虎类、狮子类、大象类根据自身攻击力重写此方法。在主程序中,使用电器类和动物类的变量来引用具体子类对象,当执行 “进入” 和 “比较” 操作时,会根据实际对象类型调用相应子类的方法。例如,将不同动物随机放入电器后,通过多态调用 “比较” 方法,依据攻击力判断电器内最终剩余的动物。这种多态的应用使得程序在处理不同类型的电器和动物时更加灵活,也方便后续添加新的电器或动物类型,而无需大幅修改主程序代码,极大地提高了程序的扩展性。
不过,在实际应用中,我对多态的理解还存在一些误区。有时候难以准确判断在什么情况下应该使用多态,以及如何正确地设计多态的层次结构。在处理复杂的业务逻辑时,多态的使用可能会导致代码的调试变得更加困难,这需要我进一步深入学习多态的原理和应用技巧。 - 四、抽象类:未完成的蓝图
抽象类是一种特殊的类,它不能被实例化,主要用于为子类提供通用的属性和方法定义。在 PTA 作业的图形类相关任务中,AbstractShape抽象类的设计让我深刻理解了抽象类的作用。它包含getArea()和show()等抽象方法,以及实现Comparable接口以支持图形面积比较的相关定义,为Rectangle、Circle等子类提供了统一的框架。子类只需根据自身图形特点实现抽象方法,就能快速构建出完整的图形类体系,使得代码的结构更加清晰,也方便了后续的维护和扩展。
在 “大象进冰箱” 实验里,我将电器类和动物类设计为抽象类。电器抽象类中定义了容纳动物的抽象方法,以及电器通用的属性和行为;动物抽象类中定义了与其他动物比较的抽象方法,以及动物共有的属性和行为。微波炉类、冰箱类、洗衣机类继承电器抽象类,老虎类、狮子类、大象类继承动物抽象类。抽象类在这里起到了很好的规范作用,确保每个子类都具备抽象类所定义的基本功能,同时又能根据自身特点进行个性化实现。例如,不同的电器子类在实现容纳动物方法时,会结合自身容积等特性;不同的动物子类在实现比较方法时,会依据自身攻击力等属性。
但是,在使用抽象类时,我对抽象方法和普通方法的设计还不够合理。有时候将一些不应该抽象的方法定义为抽象方法,导致子类的实现过于复杂;或者没有充分利用抽象类的优势,在子类中重复编写了一些可以在抽象类中实现的通用代码。这反映出我对抽象类的设计原则和应用场景还需要进一步深入理解和掌握。 - 五、接口:功能的契约
接口是 Java 中实现多继承的一种方式,它定义了一组方法的签名,但不包含方法的实现。在 PTA 的一个关于支付系统的作业中,我定义了一个支付接口,包含支付、退款等方法。然后创建了支付宝类、微信支付类等实现支付接口,并实现接口中的方法。通过接口,不同的支付方式可以统一遵循相同的规范,使得支付系统的扩展性和可维护性大大提高。在主程序中,只需要通过支付接口类型的变量来调用支付和退款等方法,而不需要关心具体的支付实现类,这体现了接口的灵活性和通用性。
在 “大象进冰箱” 实验中,虽然未大量使用接口,但我也尝试引入接口来增强程序的扩展性。比如定义了一个 “竞争” 接口,包含竞争相关的方法签名,让老虎类、狮子类等动物类实现该接口,以实现动物之间基于攻击力的竞争逻辑。通过接口,后续若需要添加新的竞争规则或参与竞争的动物类型,只需让新的类实现 “竞争” 接口并实现相应方法即可,而无需修改其他动物类和主程序中与竞争相关的核心逻辑。不过,在使用接口时,我对接口的设计粒度把握不够准确。有时候定义的接口过于庞大,包含了过多不相关的方法,导致实现类的代码变得复杂;或者接口的定义过于细化,增加了代码的复杂度和维护成本。同时,在接口的继承和组合使用方面,我还缺乏足够的经验,需要进一步学习和实践。 - 六、集合框架:数据的有序管理
Java 集合框架提供了丰富的数据结构和算法,用于存储和操作数据。在 PTA 作业中,关于图形类的题目涉及到集合框架的深度应用。通过ShapeUtil类来管理图形对象集合,init()方法允许用户循环输入并创建Rectangle、Circle、Ball、Box等图形对象,将它们添加到list集合中;shapeSort()方法利用集合的排序特性,对list中的图形对象按面积大小进行升序排序;Max()和Min()方法通过遍历集合,找出面积最大和最小的图形对象;getSumArea()方法则累加集合中所有图形对象的面积。在这个过程中,我熟练掌握了ArrayList等集合类的常用操作方法,也学会了根据具体需求选择合适的集合类来解决问题。
在 “大象进冰箱” 实验中,我利用集合来管理电器和动物对象。使用ArrayList存储所有的电器对象和动物对象,方便进行随机分配操作。例如,通过生成随机数从ArrayList中选取电器和动物,实现将动物随机放进不同电器的功能。在判断电器中剩余动物时,又借助HashSet来确保每个电器中动物的唯一性,避免重复计算。同时,我还学习了如何使用迭代器遍历集合,以及如何处理集合中的数据类型转换等问题。但在使用集合框架时,我对一些高级特性和算法还不够熟悉。例如,对TreeSet的排序原理和Comparator接口的使用还不够熟练,在处理复杂的数据排序和查找需求时,往往无法选择最优的集合类和算法。此外,在集合的线程安全问题上,我也缺乏足够的认识和实践经验,这是我在后续学习中需要重点加强的部分。 - 七、异常:程序的保驾护航者
异常处理是 Java 程序中保证程序稳定性和健壮性的重要机制。在 “大象进冰箱” 实验中,要求从文件读取动物和电器的信息,这就涉及到大量的异常处理。我使用try-catch语句块来捕获文件读取过程中可能出现的异常,如文件不存在异常、读取权限不足异常等。当进行动物放入电器操作时,可能会出现动物体积超过电器容积的情况,此时我抛出自定义的 “容纳异常”,并在调用处使用try-catch语句进行捕获,提示用户该动物无法放入此电器。在比较动物攻击力判断电器中剩余动物时,也可能出现数据异常的情况,同样通过异常处理来保证程序的稳定运行。通过异常处理,程序可以更加友好地与用户交互,提高用户体验。然而,在实际应用中,我对异常的分类和处理策略还不够清晰。有时候会将所有的异常都捕获并简单处理,没有根据异常的类型进行针对性的处理,导致程序出现潜在的问题。而且在自定义异常的设计和使用方面,我还缺乏足够的经验,需要进一步学习和实践。 - 八、JavaFX:图形界面的构建利器
JavaFX 是 Java 用于创建富客户端应用程序的图形用户界面库。在学习 JavaFX 的过程中,通过实验我对其有了初步的认识和实践。我们使用 JavaFX 完成了一个航空货运管理系统,利用 JavaFX 的各种组件构建了货运信息展示、订单管理、货物追踪等界面,通过布局管理器将组件进行合理的排列。同时,我学习了如何为组件添加事件监听器,实现诸如订单查询、货物录入等功能的逻辑处理。通过这个实验,我掌握了 JavaFX 的基本开发流程和常用组件的使用方法。
但是,在使用 JavaFX 开发复杂界面时,我遇到了很多困难。对 JavaFX 的样式表(CSS)的使用还不够熟练,难以实现美观、个性化的界面效果。在处理界面与业务逻辑的分离方面,我也缺乏有效的方法,导致代码的可维护性较差。此外,对于 JavaFX 的动画效果和多媒体处理等高级功能,我还没有进行深入学习和实践,这是我在后续学习中需要努力提升的方向。 - 九、学习收获与不足
通过这一学期对 Java 面向对象技术的学习,我在理论知识和实践能力方面都取得了很大的进步。我掌握了封装、继承、多态等面向对象的核心概念和技术,并能够在 PTA 作业和实验中进行应用。对集合框架、异常处理和 JavaFX 等相关技术也有了较为系统的认识,具备了开发一些简单 Java 应用程序的能力。
然而,我也清楚地认识到自己存在的不足之处。在面向对象的设计原则和模式方面,我还缺乏深入的学习和理解,在实际项目中难以运用合理的设计模式来优化代码结构。对于一些高级技术和特性,如反射、泛型等,我只是有了初步的了解,还没有进行深入的学习和实践。在代码的规范性和可读性方面,我还有很大的提升空间,需要进一步加强编码习惯的培养。
踩坑心得
在整门 Java 课程的学习过程中,我走过不少弯路,也从中吸取了许多宝贵的经验教训。
在语法运用方面,初期对一些基础语法掌握不扎实,导致在编写代码时频繁出错。比如在使用switch语句时,忘记添加break,造成了不必要的穿透现象,程序运行结果与预期不符。在处理字符串拼接时,误用+操作符与append方法,导致代码逻辑混乱。这让我明白,扎实的基础是编写正确代码的前提,后续学习中我开始注重基础知识的巩固,通过反复练习和查阅官方文档,确保对每个语法点都能熟练掌握。
在面向对象设计思路上,我曾过度追求继承的使用,导致类的层次结构过于复杂。在 “大象进冰箱” 实验中,为了实现功能,盲目创建过多的子类和继承关系,结果在维护代码时,发现各个类之间的依赖关系错综复杂,一个小的修改就可能引发其他类出现问题。经过反思,我意识到在设计类结构时,要充分考虑实际需求,遵循 “单一职责”“开闭原则” 等设计原则,优先使用组合而非继承,以降低类之间的耦合度,提高代码的可维护性。
在集合框架使用过程中,我因没有充分理解不同集合类的特点,导致选择不当。在 PTA 作业处理图形对象集合时,一开始使用LinkedList存储大量图形对象,在进行频繁的随机访问操作时,程序性能明显下降。后来通过学习才知道,ArrayList更适合随机访问,而LinkedList在插入和删除操作上更具优势。这使我明白,在使用集合框架时,必须根据具体的操作场景和数据特点,选择合适的集合类,同时要深入理解集合类的底层实现原理,才能充分发挥其性能优势。
在 JavaFX 界面开发中,我遭遇了界面与业务逻辑混杂的问题。在航空货运管理系统实验里,将大量的业务逻辑代码直接写在界面控制器类中,导致代码冗长且难以维护。随着功能的增加,代码变得越来越混乱。后来我学习了 MVC(模型 - 视图 - 控制器)模式,将数据模型、界面视图和业务逻辑进行分离,代码结构得到了极大改善。这让我深刻认识到,合理的架构设计对于大型项目的开发至关重要。
此外,在调试程序时,我曾花费大量时间逐行检查代码,却难以定位问题。后来学会使用调试工具设置断点,观察变量值的变化,才快速找到了错误根源。这让我明白,掌握高效的调试技巧能够大大提高开发效率,在遇到问题时,要善于借助工具,而不是盲目地排查代码。
改进建议及总结:
- 一、综合性总结
通过一学期 Java 面向对象技术课程的学习,我从理论与实践两方面构建起对 Java 编程的认知体系。在理论层面,系统掌握了封装、继承、多态等核心概念,理解了抽象类、接口的设计思想,以及集合框架、异常处理的运行机制;在实践方面,借助 PTA 作业和实验项目,将知识转化为代码能力,完成了从图形类管理到 “大象进冰箱” 模拟,再到航空货运管理系统界面开发等不同场景的编程实践。学习过程中,虽然不断遭遇语法误用、设计不合理等问题,但也在解决问题的过程中逐步提升了编程思维和调试能力,为后续深入学习软件工程专业知识奠定了坚实基础。 - 二、改进建议
(一)教师教学方面
加强互动反馈:课堂上可增加更多提问、小组讨论环节,及时了解学生对知识点的掌握情况。课后也可定期开展线上答疑会议,针对共性问题进行集中讲解,同时为学生提供一对一的代码指导,帮助我们更好地理解和解决编程过程中遇到的问题 。
(二)作业与实验方面
丰富作业类型:PTA 作业除了当前的编程题目,可以增加一些代码阅读、分析和修改的题目。例如给出一段存在多种面向对象设计问题的代码,让我们找出问题并进行优化,培养我们的代码审查和优化能力。同时,也可以设置一些开放性的作业题目,鼓励我们发挥创意,运用所学知识实现具有个性化功能的程序。
完善实验设计:在实验项目上,可增加实验的阶段性目标和详细的设计文档要求。以 “大象进冰箱” 实验为例,在实验开始前,引导我们先进行系统设计,包括类图绘制、模块功能划分等;实验过程中,分阶段提交代码和实验报告,及时给予反馈和指导,帮助我们更好地掌握项目开发流程,提高实验的质量和效果。
(三)课上及课下组织方式方面
构建学习社区:建立线上学习社区或学习小组,方便同学们在课下交流学习心得、分享学习资料、讨论编程问题。教师也可以参与其中,定期发布学习资源和学习任务,引导同学们进行自主学习和协作学习,营造良好的学习氛围。
浙公网安备 33010602011771号