第三次blog作业

面向对象技术学习总结

一、技术掌握情况总结

(一)封装
封装是面向对象编程的核心概念之一。在 PTA 作业和实验过程中,我深刻理解了封装的作用。封装可以将类的属性和方法隐藏起来,只通过类提供的公共接口与外部交互,这样可以保护类的内部实现细节,防止外部的错误操作。例如,在设计一个学生类(Student)时,学生的姓名、年龄等属性被封装起来,外部只能通过 getter 和 setter 方法来获取和设置这些属性值。通过这种方式,我可以确保年龄属性不会被设置为负数等不合理值,因为可以在 setter 方法中添加逻辑判断。我学会了如何合理地将类的成员变量设置为私有(private),并通过公共(public)的方法来访问和修改它们。封装让我认识到代码的模块化和安全性的重要性,也让我在设计类时更加注重如何隐藏内部细节,使类的使用更加安全和方便。

(二)继承
继承是面向对象编程中实现代码复用的重要方式。在学习过程中,我通过实验和 PTA 作业掌握了继承的基本语法和概念。通过继承,子类可以继承父类的属性和方法,这大大减少了代码的重复编写。例如,设计一个动物类(Animal)作为父类,然后让猫(Cat)和狗(Dog)类继承它。在 Animal 类中定义了如“吃”“喝”等所有动物共有的行为方法,Cat 和 Dog 类就可以直接继承这些方法,而无需重新编写。同时,我也了解到继承的层次结构和方法重写等概念。在子类中可以重写父类的方法来实现特定的功能,比如在 Animal 类中有一个“叫”的方法,Cat 类和 Dog 类可以分别重写这个方法来实现不同的叫声。不过,在学习继承的过程中,我有时会陷入过度使用继承的误区。例如,一开始我会尝试将一些只有部分相似性的类强行建立继承关系,导致类的层次结构过于复杂,难以维护。后来我意识到,应该合理地使用继承,只有当子类确实是父类的一个特例时,才应该使用继承关系。并且,我也了解到继承的局限性,如单继承语言(如 Java)中,一个类只能有一个直接父类,这在某些情况下可能会限制设计的灵活性。

(三)多态
多态是面向对象编程中最神奇的部分之一。多态分为编译时多态(方法重载)和运行时多态(方法覆盖)。在实验和作业中,我通过编写代码来理解多态的概念。方法重载允许一个类中有多个同名方法,但参数列表不同,这使得方法的调用更加灵活。例如,在一个图形类(Shape)中,可以定义多个 draw 方法,分别针对不同参数类型(如颜色、线条粗细等)进行绘图。而方法覆盖则是在子类中重写父类的方法,运行时会根据对象的实际类型来调用相应的方法。比如在前面提到的 Animal 类和 Cat 类的例子中,当调用一个 Animal 类型的变量(实际是 Cat 类型的对象)的“叫”方法时,会调用 Cat 类中重写的“叫”方法。多态让我能够编写更加通用的代码,减少代码的耦合度。例如,我可以编写一个处理 Animal 类型对象的通用方法,传入不同子类的对象时,该方法会自动调用相应子类的方法。这使得代码的可扩展性大大增强。但是,在理解多态的细节方面,我曾经有些困惑。比如,一开始我很难理解为什么在方法覆盖的情况下,方法的调用是根据对象的实际类型而不是引用类型来决定的,通过反复阅读资料和实际调试代码,我才逐渐理解了动态绑定的原理。

(四)抽象类
抽象类是不能被实例化的类,它主要用于定义一组通用的属性和方法,为子类提供一个模板。在学习抽象类时,我通过实际的编程练习掌握了它的使用。例如,设计一个图形类(Graphic)作为抽象类,其中定义了一些抽象方法,如 draw()和 erase()。然后让具体的图形类(如 Circle、Rectangle 等)继承这个抽象类,并实现这些抽象方法。抽象类让我能够将一些共性的东西提取出来,为子类提供一个清晰的框架。它使得子类的实现更加规范,因为子类必须实现抽象类中定义的抽象方法。同时,抽象类也可以包含一些非抽象的属性和方法,这些可以被子类继承和直接使用。不过,我曾经对抽象类和接口的区别有些模糊。在学习过程中,我逐渐明白抽象类更侧重于类的继承关系,它允许有部分实现代码,而接口则更侧重于行为规范的定义,接口中的方法默认都是抽象的,而且在 Java 8 之前接口不能包含具体实现代码。

(五)接口
接口是定义行为规范的一种方式。在实验和作业中,我学会了如何定义和实现接口。例如,定义一个可打印接口(Printable),其中有一个 print 方法。然后让各种需要打印功能的类(如文档类、图片类等)实现这个接口。接口的实现类必须实现接口中定义的所有方法。接口使得不同类之间可以实现解耦合。例如,一个打印服务类只需要调用实现了 Printable 接口的对象的 print 方法,而不需要关心具体是哪种类型的对象。这样,当新增一种可打印的类时,只要实现 Printable 接口,就可以很方便地接入打印服务。接口的这种特性让我能够更好地设计高内聚、低耦合的系统。而且,接口可以实现多继承,这弥补了单继承语言在某些情况下的不足。不过,在接口的使用过程中,我也发现了一些需要注意的地方。例如,接口中的方法名尽量要设计得具有通用性,避免过于具体的命名,以免限制接口的适用范围。同时,接口的定义要尽量简洁明了,避免定义过多的方法,否则实现类可能会面临实现过多方法的负担。

(六)集合框架
集合框架是 Java 中用于存储和操作一组对象的工具。在学习过程中,我通过 PTA 作业和实验熟悉了集合框架中的常用类,如 List、Set 和 Map。List 是一个有序的集合,可以存储重复的元素。例如,在一个购物车应用中,可以使用 List 来存储用户添加的商品,因为商品可能会重复添加。Set 是一个不允许存储重复元素的集合,这在需要存储唯一标识符等场景下非常有用。例如,在一个用户管理系统中,可以使用 Set 来存储用户的用户名,确保用户名的唯一性。Map 是一种键 - 值对的集合,键是唯一的,而值可以重复。例如,在一个字典应用中,可以使用 Map 来存储单词和对应的解释。我学会了如何根据不同的需求选择合适的集合类型,并且掌握了集合的基本操作,如添加、删除、查找等。集合框架中的方法非常丰富,通过学习,我能够更加高效地处理对象的集合。但是,对于集合框架中的一些高级特性,如并发集合等,我的掌握还不够深入。在多线程环境下,如何正确地使用集合来保证线程安全,还需要我进一步学习。

(七)异常
异常处理是 Java 中用于处理程序运行时可能出现的错误的一种机制。在学习异常的过程中,我通过编写代码和处理各种异常情况,掌握了异常的基本概念和处理方式。Java 中有检查型异常和非检查型异常。检查型异常必须在方法中显式地声明(使用 throws 关键字)或者在方法内部捕获(使用 try - catch 块)。例如,当尝试打开一个文件时,可能会抛出 FileNotFoundException,这是一个检查型异常。我学会了如何在代码中合理地捕获和处理异常,避免程序因为异常而崩溃。例如,在一个网络请求的代码中,可能会出现 IOException 等异常,我可以通过捕获这些异常,并给出相应的提示信息,让用户知道发生了什么问题。同时,我也学会了如何自定义异常,以便更好地描述特定的错误情况。然而,在异常处理的实践中,我曾经存在一些问题。例如,一开始我可能会过度使用 try - catch 块,导致代码的可读性变差,并且可能会隐藏一些本应该被修复的错误。后来我意识到,应该合理地使用异常处理机制,只捕获那些真正需要处理的异常,并且在捕获异常后,要尽量给出有意义的处理逻辑,而不是简单地打印堆栈信息。

(八)JavaFX
JavaFX 是一个用于创建富客户端应用程序的框架。在实验中,我初步接触了 JavaFX 的一些基本组件和布局方式。例如,学会了如何使用 Scene Builder 来设计图形用户界面(GUI),并能够将设计好的界面与 Java 代码结合起来。通过 JavaFX,我能够创建窗口、按钮、文本框等组件,并且可以为这些组件添加事件处理逻辑。例如,当用户点击一个按钮时,可以触发一个事件来执行特定的操作。JavaFX 让我感受到了图形用户界面编程的魅力,它使得程序的交互性大大增强。不过,我对 JavaFX 的掌握还处于比较浅的层次。对于复杂的布局和动画效果,我还不会设计。而且,在将 JavaFX 与后台业务逻辑深度整合方面,我还需要进一步学习,例如如何在 JavaFX 应用中实现多线程的数据更新等。

二、采坑心得

在学习面向对象技术的整个课程过程中,我走了一些弯路,也吸取了一些经验教训。

(一)概念混淆
一开始,我经常把抽象类和接口的概念混淆。我会错误地认为抽象类和接口在使用上没有什么区别,或者在设计类的时候,随意地选择使用抽象类还是接口。这导致在代码设计阶段就出现了问题,使得类的结构不合理。后来,通过对比抽象类和接口的特点,以及查看大量的代码示例,我才逐渐明白了它们的区别。例如,抽象类可以有构造方法,而接口不能有;抽象类可以有成员变量,而接口中的成员变量默认是静态常量等。这个教训让我明白,在学习新概念时,不能只是简单地记住它们的定义,而是要深入理解它们的本质区别和适用场景。

(二)过度设计
在一些实验项目中,我曾经出现过度设计的问题。例如,在设计一个简单的图书管理系统时,我试图引入过多的设计模式和复杂的类结构。我创建了过多的抽象类、接口和继承层次,结果导致代码变得难以理解和维护。而且,在实际的功能实现过程中,很多复杂的结构并没有发挥实际的作用,反而增加了开发的难度和时间。这个教训让我认识到,设计应该遵循 KISS(Keep It Simple, Stupid)原则,即保持简单。在设计系统时,应该根据实际需求来选择合适的设计方式,避免过度设计。只有当系统确实需要扩展性和灵活性时,才应该考虑使用复杂的设计模式和结构。

(三)调试困难
在编写代码的过程中,我经常遇到调试困难的情况。一开始,我会花费大量的时间在调试上,却很难找到问题的根源。例如,在使用继承和多态时,可能会出现方法调用错误,或者在集合操作中出现数据异常。后来,我学会了使用一些调试工具和技巧来提高调试效率。例如,在 Java 开发环境中,我可以使用断点调试功能,逐步跟踪程序的执行过程,观察变量的值变化。同时,我也学会了通过打印日志的方式来定位问题。在代码的关键位置添加日志信息,可以帮助我了解程序的实际运行情况。这个教训让我明白,调试是编程过程中不可或缺的一部分,掌握有效的调试方法可以大大提高开发效率。

(四)代码复用性差
在一些作业中,我发现自己编写的代码复用性很差。例如,在不同项目中,可能会有相似的功能模块,但我却每次都重新编写代码,没有充分利用已有的代码。这不仅浪费了时间,而且也增加了出错的可能性。后来,我开始注重代码的复用性。我会将一些通用的功能封装成类或者方法,存放在一个工具类库中。在新的项目中,可以直接调用这些工具类,减少重复代码的编写。同时,我也学会了如何合理地组织代码结构,使得代码更加模块化。这个教训让我认识到,代码复用是提高开发效率和质量的重要方式,应该在平时的编程过程中养成良好的代码复用习惯。

三、改进建议及总结

(一)课程综合性总结
这门面向对象技术课程让我对面向对象编程有了全面而深入的理解。从封装、继承、多态等基本概念,到抽象类、接口、集合框架、异常处理和 JavaFX 等具体技术的应用,课程内容丰富,涵盖了面向对象编程的各个方面。通过 PTA 作业和实验,我能够将理论知识应用到实际编程中,加深了对知识的理解。课程的设置也让我学会了如何分析问题、设计解决方案和实现代码,培养了我的编程思维和实践能力。在学习过程中,我感受到了面向对象技术的强大功能,它使得程序的结构更加清晰、易于维护和扩展。同时,我也意识到学习面向对象技术是一个不断积累和实践的过程,需要不断地通过实际项目来加深对知识的掌握。

(二)改进建议

对教师的建议
案例教学方面:教师可以增加一些更贴近实际应用场景的案例。目前的案例虽然能够帮助理解基本概念,但有些案例相对简单和抽象。如果能够引入一些企业级的、复杂的案例,让学生在学习过程中就能接触到实际开发中可能会遇到的问题,将更有助于学生对知识的深入理解和应用。例如,在讲解 JavaFX 时,可以提供一个完整的商业级的 JavaFX 应用案例,让学生了解如何在一个大型项目中使用 JavaFX。
辅导答疑方面:在学生遇到困难时,教师可以提供更有针对性的辅导。除了课堂上的讲解和答疑时间,可以建立一个线上答疑平台,让学生能够随时提问,并且能够得到及时的回复。同时,教师可以根据学生在作业和实验中出现的共性问题,定期组织专题辅导讲座,帮助学生解决这些问题。

对课程的建议
课程内容更新方面:随着技术的不断发展,课程内容应该及时更新。例如,Java 语言本身也在不断更新,新的特性(如 Java 17 的模式匹配等)应该被纳入课程内容中。同时,对于一些新兴的面向对象编程框架和技术(如 Spring Boot 中的面向对象设计模式应用),也应该适当介绍,让学生了解面向对象技术在现代软件开发中的最新应用。
实践环节比重方面:可以适当增加实践环节的比重。目前的实验虽然有一定的实践性,但相对于理论教学来说,比重还是较小。可以增加一些综合性的实验项目,让学生在项目中综合运用所学的面向对象技术。例如,设计一个小型的电商系统,让学生从需求分析、系统设计到代码实现都运用面向对象的方法,这样可以更好地锻炼学生的实践能力。
对作业和实验的建议
作业难度梯度方面:作业的难度应该有更合理的梯度。目前的作业在难度上有些跳跃,部分作业对于初学者来说难度较大,容易打击学生的学习积极性。可以设计一些由易到难的作业序列,让学生在逐步完成作业的过程中,逐渐掌握知识和技能。例如,在学习集合框架时,先让学生完成一些简单的集合操作作业,然后再逐步增加难度,如要求学生实现一个自定义的集合类。
实验反馈方面:实验的反馈机制可以更加完善。目前学生在完成实验后,只能得到一个简单的分数或者通过 / 不通过的结果。可以增加一些详细的反馈意见,指出学生在实验中做得好的地方和需要改进的地方。同时,可以提供一些参考代码和分析,让学生能够更好地理解实验的要求和自己的不足之处。

对课上及课下组织方式的建议
课上互动方面:在课堂上可以增加更多的互动环节。目前课堂主要是教师讲解为主,学生参与度相对较低。可以采用小组讨论、现场编程等方式,让学生在课堂上就能积极参与到学习中来。例如,在讲解多态时,可以让学生分组讨论多态在实际生活中的例子,然后现场编写代码来实现这些例子,这样可以提高学生的学习兴趣和参与度。
课下学习资源方面:可以提供更丰富的课下学习资源。除了教材和教师提供的讲义外,可以推荐一些优质的在线课程、学习网站和书籍。同时,可以建立一个课程学习社区,让学生在课下能够互相交流学习心得,分享代码和经验。这样可以营造一个良好的学习氛围,促进学生之间的相互学习和进步。

总之,这门面向对象技术课程让我收获颇丰。虽然在学习过程中遇到了一些困难和问题,但通过不断的学习和实践,我逐渐克服了这些困难。对于课程的改进,我相信通过教师、学生和课程设计者的共同努力,这门课程会变得更加完善,能够更好地培养学生的面向对象编程能力。

posted @ 2025-06-21 20:54  qjc…  阅读(28)  评论(0)    收藏  举报