面向对象程序设计课程总结
一、前言
本学期的面向对象程序设计课程学习即将落下帷幕,在本学期中,前两次的Blog作业均对各三次的PTA题目集进行总结。其中,PTA的题目集5、6、7的主要难题是单部电梯调度程序问题,个人认为难度很大,问题主要在算法的设计上;而题目集8、9、10的主要难题是航空货运管理系统问题,难度较大,问题主要是抽象类、继承与多态、接口和容器类的使用。本学期课程的五次实验主要围绕大象装进冰箱问题展开,难度逐次提升,要求掌握抽象类、继承与多态和接口的概念及使用,其中第五次实验涉及JavaFx界面的设计,难度很大。线上课程以视频内容为主,加以作业和讨论为辅,工作量不算大,能够在线下课程开始前打下基础。线下课程着重讲授重点内容,学期末尾课程还采用翻转课堂的形式。在以上的授课方式下,本门课程也迎来了尾声,本学期对面向对象程序设计课程收获还是很多的。
二、面向对象技术总结
经过一学期的学习,对以下面向对象技术作出总结。
1.封装
理解了封装是将数据和操作数据的方法进行绑定,通过访问修饰符(如private、protected、public)隐藏对象内部细节,仅暴露必要的接口。在PTA作业和实验中均频繁使用封装技术,通过private修饰类的属性,然后提供public的getter和setter方法实现对属性的访问和修改。封装提高了代码的安全性和可维护性,避免外部直接操作数据导致的错误,同时也使得类的接口更加清晰。通过本学期的学习,我能够熟练运用private、public等访问修饰符对类的属性和方法进行封装,并根据实际需求设计合适的getter和setter方法。但在封装的高级应用方面,我仍存在不足。例如,对于如何确定一个类应该暴露哪些接口,缺乏清晰的判断标准,有时会过度暴露内部细节,影响代码的安全性和可维护性。此外,设计抽象类时,总是把属性设计成private而不是protected导致作用域出问题,都是需要改进的地方。
2.继承
继承是子类获取父类属性和方法的机制,通过extends关键字实现,支持单继承。使用super关键字,用于调用父类的构造方法和被重写的方法;理解了构造方法的继承顺序。能够正确实现类的继承关系,并合理重写父类方法。在实验中,设计了Animal和Electric两个抽象类,而Elephant、Lion、Tiger子类继承Animal类,IceBOX、Microwave、Washing子类继承Electric类,分别继承父类的属性和方法。虽然掌握了继承的基本语法和应用,但我在继承的设计上仍存在问题。有时为了方便复用代码,过度使用继承,导致类层次结构变得复杂,违背了 “里氏替换原则”,使得代码在后续维护中出现了逻辑混乱。此外,对于父类和子类之间的初始化顺序,以及 super 关键字在不同场景下的准确使用,还需要进一步加深理解和实践。
3.多态
多态是指同一个操作作用于不同的对象,可以有不同的解释和产生不同的执行结果,包括编译时多态(方法重载)和运行时多态(方法重写)。其中,方法重载为类提供多个功能相似但参数不同的方法,方法重写则是通过父类引用指向子类对象来实现,需要使用@Override进行方法重写。比如在一个PTA作业中,定义了Shape抽象类,包含getColor()抽象方法,Circle、Rectangle等子类继承Shape类并实现getColor()方法。多态通过父类引用指向子类对象,调用方法时根据实际对象类型确定执行的方法,我也掌握了instanceof运算符的使用。对于多态的基本应用,我能够熟练掌握。但在理解多态的底层实现机制,如动态绑定的具体过程时,还存在一定困难。在复杂的继承和多态关系中,有时会混淆方法的调用顺序,导致程序出现错误。此外,在实际问题中,如何更好地利用多态特性,设计出更具扩展性和可维护性的代码,也是我需要提升的地方。
4.抽象类
抽象类是包含抽象方法的类,它不能被实例化,必须由子类继承并实现抽象方法,用于定义一组相关类的公共接口和部分实现,作为类层次结构的基类。在PTA作业与实验中都频繁使用到,如在PTA作业中,设计了抽象父类 Shape类,包含抽象方法getArea ()和getPerimeter (),具体子类(如Circle、Rectangle)继承并实现这些方法。目前我能够正确定义抽象类和抽象方法,并通过子类实现,也理解了抽象类在设计模式中的应用,对抽象类的应用场景有了一定认识,但在抽象类与接口的选择上,有时会出现混淆。抽象类可以包含具体实现方法和属性,而接口只能包含抽象方法。在实际问题中,如何根据具体需求准确选择抽象类或接口,以达到最佳的设计效果,我还要加强学习。同时,对于抽象类在设计模式中的深度应用,也需要加强理解。
5.接口
接口是一组抽象方法的集合,接口中的方法默认是public abstract的,Java 8及以后支持默认方法和静态方法。类可以实现多个接口,弥补了Java单继承的限制;接口之间可以继承。在实验中,定义了可比较接口 Comparable,让动物类实现该接口,实现按体重排序的功能。通过学习,我能够熟练定义接口并让类实现接口,实现多态性;在实验中,通过接口实现了不同功能的组合,提高了代码的灵活性。虽然能够使用接口实现多态和功能扩展,但我对接口中的默认方法和静态方法的应用还不够熟练。在处理复杂业务逻辑时,没有充分利用这些特性简化代码。此外,在设计复杂问题的接口时,如何合理划分接口的职责,避免接口过于庞大和复杂,我还有不足的地方,需要提高自己的接口设计水平。
6.集合框架
Java集合框架是Java编程中处理数据集合的重要工具,它包含Collection接口(List、Set)和Map接口。通过学习,我掌握了ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等类的特点和使用场景,理解了泛型的作用,能够在集合中使用泛型避免类型转换错误,增强代码的类型安全性。在PTA作业中,我经常使用ArrayList存储有序的元素集合,如订单信息;使用HashSet存储不重复的元素。对集合框架,我能够根据不同需求选择合适的集合类,熟练使用集合的基本操作。在实验中,使用迭代器遍历集合,使用Comparator进行自定义排序。尽管掌握了集合框架的常用操作,但我对集合的底层实现原理了解不够深入。例如,ArrayList的动态数组扩容机制、HashMap的哈希算法和冲突解决策略等,还有对并发集合(如ConcurrentHashMap)和集合的线程安全问题了解较少,这些欠缺影响了我对集合性能优化的能力。在处理大量数据时,无法根据具体需求选择最适合的集合类,导致程序运行效率低下。
7.异常
我理解了异常的分类(checked异常和unchecked异常),掌握了try-catch-finally结构和throws、throw关键字的使用,学会了捕获异常、处理异常和抛出异常,以及自定义异常类。比如处理用户输入错误导致的异常,如输入非数字字符时捕获NumberFormatException;在文件操作中处理IOException。通过学习,我能够正确使用异常处理机制,提高程序的健壮性。在实验初设计的代码中,自定义了业务异常类,如UserInputException,用于处理特定的业务错误。但是对异常处理的最佳实践(如不要捕获Throwable、避免过于宽泛的catch块)理解不够深入,而且对异常链的使用不够重视。
8.JavaFx
通过学习,我了解了JavaFX的体系结构,包括舞台(Stage)、场景(Scene)、节点(Node)等核心概念;掌握了常用UI组件的使用,如Button、Label、TextField、TableView等;学习了FlowPane、BorderPane、GridPane等布局容器的使用;掌握了事件监听机制,通过匿名内部类或Lambda表达式处理用户交互事件。在实验中,通过BorderPane布局容器将界面划分为顶部、中间区域和底部。利用事件监听机制,为按钮添加点击事件处理逻辑,实现了把动物装入电器等功能。目前我能够创建基本的 JavaFX 应用程序,实现简单的界面布局和交互功能。但是我开发的JavaFX应用程序界面较为简陋,对JavaFX的高级特性,如动画效果、自定义组件、CSS样式等掌握不足。在界面交互方面,对于复杂的用户操作逻辑处理不够流畅。
9.总结
已掌握的核心内容:
(1)面向对象的三大特性(封装、继承、多态)的基本概念和应用。
(2)抽象类和接口的定义及区别,能够根据场景选择合适的方式。
(3)集合框架的常用类和操作,能够根据需求选择合适的集合类型。
(4)异常处理的基本机制,能够编写健壮的异常处理代码。
(5)JavaFX 的基本使用,能够开发简单的图形界面应用。
有待提升的方面:
(1)面向对象的设计原则(如SOLID原则)的理解和应用。
(2)集合的底层实现原理和性能优化。
(3)异常处理的最佳实践和资源管理。
(4)JavaFX 的高级特性和复杂界面设计。
(5)各技术点之间的综合应用能力,如在实际问题中整合面向对象特性、集合和异常处理。
三、踩坑心得
1.概念理解层面的弯路与教训
初学时,我将封装、继承、多态等核心概念简单化。例如,认为封装仅仅是使用访问修饰符隐藏属性,忽略了其在数据保护、接口设计以及代码模块化方面的深层意义。在实际编程中,由于对封装理解不全面,设计的类接口混乱,外部可以随意修改内部数据,导致程序出现数据不一致等问题。在学习抽象类和接口时,我未能清晰区分两者的差异,在设计类结构时频繁选错工具。
教训:面向对象课程的学习过程应结合实际案例,深入思考每个概念在编程中的作用和应用场景;抽象类和接口虽然都可用于定义规范,但抽象类更侧重于为子类提供公共实现,接口则强调行为的定义。在实际应用中,需根据具体需求,如是否需要实现部分方法、是否涉及继承层次等,谨慎选择使用抽象类或接口。
2.编程实践过程中的错误
学习继承特性后,为减少代码重复,我过度使用继承关系,结果导致类层次结构复杂混乱,子类与父类之间的依赖关系难以理清。当修改父类的某个方法时,引发多个子类出现错误,代码难以维护。
教训:继承虽然是实现代码复用的重要手段,但并非所有代码复用都适合用继承。在使用继承时,应确保子类与父类之间存在合理的“is-a”关系,并且要充分考虑继承带来的复杂性,避免因过度继承破坏代码的可维护性。
3.学习方法与习惯上的不足
课程前期,我将大量时间用于阅读教材和观看理论讲解视频,很少动手编写代码。结果在实际做作业和实验时,面对简单的编程任务也无从下手,理论知识无法转化为实际编程能力。而且在编程过程中,我为了追求速度,忽视代码规范和注释的编写。代码命名随意,格式混乱,并且很少添加注释说明代码的功能和逻辑。一段时间后,当重新查看自己编写的代码时,连自己都难以理解代码的含义,给后续的代码修改和维护造成极大困难。
教训:面向对象程序设计是一门实践性很强的课程,只有通过大量编程实践,才能真正理解和掌握知识。学习过程中应将理论学习与实践操作紧密结合,每学习一个知识点,都要通过编写代码进行验证和巩固,在实践中发现问题、解决问题,加深对知识的理解。而在编程过程中,规范的代码命名和格式有助于提高代码的可读性;清晰的注释能有助于快速理解代码的功能和实现思路。在编程时,应严格遵循代码规范,及时添加必要的注释,养成良好的编程习惯。
四、改进建议及总结
通过本门课程的学习,我系统掌握了面向对象编程的核心概念与技术。在理论层面,深入理解了封装、继承、多态等特性,以及抽象类、接口的设计与应用;在实践中,借助PTA作业和实验,熟练运用集合框架处理数据,掌握JavaFX实现基本的图形化界面,同时学会通过异常处理保障程序健壮性。课程将理论与实践结合,并借助翻转课堂的形式,有效提升了我的编程思维和问题解决能力。而经过这一个学期的学习,我深刻感受到了老师的负责,包括将理论与实践编程结合起来,另外课后还有作业,极大提高了我对这门课程的掌握程度,虽然还是只算得上基础的水准,但比起C语言的学习简直好太多(没有说C语言教的不好的意思,是我学的不好)。在今后的学习和实践中,我也会不断改进学习方法,加强实践锻炼,注重知识的综合运用和代码质量的提升,努力提高自己的面向对象编程能力。

浙公网安备 33010602011771号