第三次blog作业
Java 面向对象课程学习总结与反思
前言
在本学期的 Java 面向对象课程学习中,我经历了丰富且充实的学习过程,涵盖了 Blog 作业、PTA 作业、实验、线上课程以及线下课程等多个教学环节。这些学习任务相互配合、层层递进,帮助我逐步构建起 Java 面向对象编程的知识体系。
从工作量来看,课程的各项任务安排较为紧凑。每周都有固定的 Blog 作业,要求我们对所学知识进行总结和反思,累计完成了十余篇,不仅锻炼了文字表达能力,更促使我们深入思考课程内容。PTA 作业数量众多,平均每周有一次大作业,题量从基础的语法练习到复杂的综合应用题目不等,涵盖了课程各个阶段的知识点。实验环节则需要我们在实验室环境中完成,每个实验都有明确的目标和要求,通常需要花费 3 - 4 个小时才能完成一个综合性较强的实验项目。线上课程资源丰富,视频时长累计超过 60 小时,线下课程每周 2 次,教师在课堂上进行知识点的深入讲解和案例分析。
在难度方面,初期的课程内容,如基础语法、简单类的定义等,相对容易理解和掌握。随着课程的推进,面向对象的核心概念,如封装、继承、多态等逐渐引入,难度开始提升。尤其是在 PTA 作业和实验中,将这些概念综合运用到实际问题解决时,常常面临较大挑战。例如,在涉及复杂继承关系和多态应用的题目中,需要准确理解和把握对象之间的关系以及方法的调用规则。集合框架、异常处理以及 JavaFX 等内容的加入,进一步增加了学习难度,这些知识点不仅需要掌握理论知识,更要通过大量实践才能熟练运用。
总体而言,虽然课程任务量较大且存在一定难度,但通过合理安排时间、积极参与课堂和课后练习,逐步克服了学习过程中的困难,对 Java 面向对象编程有了较为系统的认识和掌握。
面向对象技术总结
封装
在课程实践和相关代码中,封装的应用让我有了深刻体会。以订单管理系统代码为例,在Customer类中,将id、name、phone、address等属性设置为私有,通过getName、getPhone等公共方法进行访问。这样的设计隐藏了客户信息的内部实现细节,外部代码只能通过规定的方法获取或修改相关信息,确保了数据的安全性和一致性。比如,若外部尝试直接修改id,在封装机制下是无法实现的,必须通过类内部设计好的逻辑来间接处理,避免了非法数据的写入。
起初,我仅从语法层面理解封装,认为私有化属性并提供访问方法就是全部。但随着对代码的深入分析以及更多实践,我意识到封装是对数据和操作的全方位保护与管理。就像在Cargo类中,width、length等属性也被封装起来,外部要获取货物的计费重量,只能通过getChargeableWeight方法,而该方法内部整合了体积重量计算等复杂逻辑,外部无需关心这些细节,只需要调用方法获取结果即可。这不仅提高了代码安全性,也增强了可维护性与可复用性,当计算规则改变时,只需要修改Cargo类内部方法,不影响外部调用。
目前,我对封装基本语法和常见场景运用较熟练,但在复杂业务场景,如多个类之间存在复杂依赖关系时,如何精准划分属性和方法的访问权限,还需进一步钻研。例如在订单处理流程中,多个类协作访问客户和货物信息,可能会因权限设置不当,导致数据访问混乱或安全漏洞。
继承
继承作为实现代码复用的关键机制,在课程学习和代码实践中得到了充分体现。在订单管理系统代码里,IndividualCustomer和CorporateCustomer类继承自Customer抽象类,重写了getDiscountRate方法,分别实现个人客户 9 折和集团客户 8 折的优惠策略。这体现了继承减少代码重复的优势,Customer类中已定义的客户基础信息和部分通用方法,子类无需重复编写,直接继承使用,提高了开发效率。
通过对代码的深入分析,我更深刻理解了继承原理。在Cargo类体系中,NormalCargo、DangerousCargo和ExpediteCargo继承自Cargo抽象类,重写getRate方法来实现不同类型货物的计费规则。这样的设计使得代码结构清晰,当需要新增货物类型时,只需继承Cargo类并实现相应抽象方法即可。
不过,在学习中也遇到问题。在模拟多重继承关系场景下,容易出现属性和方法命名冲突。同时,对于父类构造方法的调用顺序理解不够透彻,例如在子类对象创建时,父类构造方法何时以及如何被调用,如果不清晰,可能导致对象初始化错误。对于复杂继承层次结构的设计与组织,还需更多实践来提升能力。
多态
多态赋予程序强大的扩展性和灵活性,在课程代码实践中有着生动的展现。在订单管理系统代码中,通过父类Customer引用指向IndividualCustomer或CorporateCustomer子类对象,并调用重写的getDiscountRate方法,实现不同客户类型的折扣计算。如在订单总价计算getTotalFreight方法中,total * customer.getDiscountRate()这行代码,customer对象根据实际指向的子类,自动调用对应子类的getDiscountRate方法,实现多态效果。
在Cargo类体系中,多态也得到充分体现。Order类的printOrder方法遍历cargos列表时,无论列表中是NormalCargo、DangerousCargo还是ExpediteCargo对象,都统一调用getDetail方法输出货物明细,不同子类根据自身特性展示相应数据。这使得代码更抽象通用,新增货物类型时,无需修改Order类的遍历和输出逻辑,只需实现新子类的相关方法。
但实际应用中,我在判断对象具体类型时偶有逻辑错误,特别是在多层继承和复杂多态关系下。例如在处理订单业务时,需要根据客户或货物类型执行不同后续操作,若类型判断错误,会导致业务逻辑出错。对于多态在接口实现中的深层次应用,还需深入学习。
抽象类
抽象类为子类提供统一抽象接口,在课程学习和代码编写中发挥着重要作用。Customer和Cargo抽象类定义了抽象方法,如Customer的getDiscountRate和Cargo的getRate,规范了子类必须实现的行为。这保证了子类在遵循统一规则的前提下,实现各自业务逻辑,如不同客户类型的折扣计算,不同货物类型的计费规则。
抽象类能提取共性行为和属性,提升代码复用性与可维护性。Cargo类中定义的getVolumeWeight、getChargeableWeight等方法,是各类货物都通用的计算逻辑,子类继承后可直接使用,避免重复实现。同时,抽象类为系统架构设计提供清晰思路,使代码结构更合理。
然而,使用抽象类时,我对抽象方法和具体方法的界定不够精准,有时导致子类实现困难。例如在设计新的抽象类时,难以判断哪些方法应定义为抽象,哪些可以提供具体实现。对于抽象类和接口的区别及适用场景,还需进一步加深理解。
接口
接口作为特殊的抽象类型,在课程实践的代码里有着重要意义。PaymentMethod接口定义了getPaymentName抽象方法,WechatPayment、AliPayPayment和CashPayment类实现该接口,分别实现不同支付方式的名称获取功能。这降低了类之间的耦合度,如Order类在处理支付业务时,只依赖PaymentMethod接口,不关心具体是哪种支付方式实现,提高了系统灵活性和扩展性。当新增支付方式时,只需创建新类实现PaymentMethod接口,无需修改Order类核心代码。
一个类可实现多个接口,赋予其多种行为。虽然现有代码中未体现类实现多个接口的场景,但从设计理念出发,若后续拓展订单系统,可让订单类实现如Cancelable(可取消订单)、Trackable(可追踪订单)等接口,为订单增加更多功能。
在接口学习应用中,遇到多个接口存在相同方法签名时,类实现接口容易混淆。对于接口在设计模式中的应用,如工厂模式、策略模式等,还需进一步探索学习。
集合框架
集合框架用于存储和操作对象,在课程的代码实践中有着广泛应用。在订单管理系统代码中使用ArrayList存储Cargo对象,在Order类的构造函数和getTotalWeight、getTotalFreight等方法中,通过cargos列表方便地添加、遍历货物对象,完成订单相关数据处理。如for (Cargo cargo : cargos)语句,利用增强型for循环遍历列表,计算订单总重量和总运费。
通过实践,我掌握了不同集合类型特点。List适合有序、可重复元素存储,像订单中的货物列表,每个货物都有添加顺序,且可能存在相同类型货物;Set适用于无序、不重复元素,若要统计订单中不同类型货物数量,可将货物类型存入Set;Map适合键值对存储,如统计不同客户的订单数量,可用客户名称作为键,订单数量作为值。
但我对集合泛型使用、排序查找算法等高级特性掌握不熟练。在处理大量订单和货物数据时,如何优化集合操作性能,选择合适集合类型,还需进一步学习实践。
异常
异常处理保障程序健壮性,虽然在现有订单管理系统代码中未显式处理异常,但在实际场景中,如文件读取订单数据、网络传输订单信息时,可能出现FileNotFoundException、IOException等异常。若要完善代码,可以在读取用户输入的相关方法周围添加try-catch块,捕获可能的InputMismatchException等异常,避免程序因用户输入不合法而崩溃。
在用户注册、订单提交等功能开发中,自定义异常类也很关键。例如在代码中可自定义InvalidOrderException,当订单信息不完整或不符合规则时抛出该异常,使错误处理逻辑和正常业务逻辑分离,提高代码可读性和可维护性。
但我在应用中存在捕获异常范围不当问题,要么捕获范围过大隐藏真实错误,要么过小导致异常未被处理。对于异常链使用和最佳实践,还需深入学习。
JavaFX
JavaFX 用于创建富客户端应用,在课程实验中,我尝试用 JavaFX 设计类似订单管理系统的界面,使用布局管理器排列按钮、文本框等控件,通过事件处理机制实现按钮点击查询订单、提交订单等功能。JavaFX 通过 FXML 文件和 Java 代码分离界面和业务逻辑,提高开发效率,如 FXML 文件负责界面布局设计,Java 代码处理业务逻辑。
但学习中遇到困难,对 FXML 文件语法和使用不熟悉,布局设计和控件样式设置不够美观。对于 JavaFX 动画效果、多媒体支持等高级功能,还需进一步探索学习。
采坑心得
在整门课程学习中,我走过不少弯路,积累了宝贵经验。
初期对概念理解不深,在 PTA 作业和代码编写时,常出现语法和逻辑错误。如定义类时,对属性和方法访问权限把握不准,导致外部无法正确访问。在继承和多态应用中,混淆父类子类关系,出现方法重写错误。通过查阅资料、请教他人和反复练习,逐渐攻克这些问题。
实验时调试困难,程序出错难以定位。以订单系统代码调试为例,当计算的订单总运费结果错误时,通过输出调试信息难以发现问题。后来学会使用 IDE 调试工具,设置断点、单步执行,跟踪变量值变化,才找到问题所在,如货物计费重量计算错误。
在集合框架应用中,使用HashMap时,因不理解键值对唯一性和哈希算法原理,插入和查询数据出现意外。通过学习哈希表原理,重写hashCode和equals方法,解决了该问题。
JavaFX 学习中,因缺乏界面设计经验,布局和交互设计不佳。通过参考优秀案例,学习布局管理器和样式设置技巧,逐步提升设计能力。
这些经历让我明白,编程学习遇到问题很正常,要保持积极心态,善于利用资源解决问题,注重基础知识积累,深入理解技术原理,才能应对复杂挑战。
改进建议及总结
课程综合性总结
通过本学期 Java 面向对象课程学习,我系统掌握了核心概念和技术,包括封装、继承、多态、抽象类、接口、集合框架、异常处理和 JavaFX。通过多种学习方式,提升了编程实践、独立思考和解决问题的能力。
课程教学内容安排合理,循序渐进。线上资源丰富便于复习拓展,线下教师讲解结合案例,帮助理解抽象概念。课程激发了我对 Java 编程的兴趣,为后续学习和软件开发打下坚实基础。
改进建议
教学方法:课堂增加小组讨论、问答等互动环节,提高参与度。讲解抽象概念时,结合更多实际案例,如以订单管理系统代码为例,讲解面向对象技术应用,帮助学生理解。
作业安排:PTA 作业增加实际应用题目,如开发简化版订单管理系统,锻炼综合应用能力。提供更多作业提示和引导,帮助学生理解题意和解题思路。
实验环节:实验提前提供参考资料和示例代码,如订单管理系统的部分实现代码。增加教师巡回指导次数,及时解决学生问题。组织实验成果展示交流,促进学习。
线上课程:视频添加字幕和重点标注,方便学习。设置讨论区,鼓励提问分享,增强互动性。
课下组织方式:建立学习小组,开展学习交流和项目合作。定期举办分享会,分享经验和成果,营造良好学习氛围。