前言
本次博文不再建立在题目集上的心得了,而是在学习了面向对象这门课后的一个总结,所以可以随心所欲一点了😄。面向对象是一门技术,我是以Java这门面向对象编程语言为媒介来学习面向对象这门技术的。它区别与C语言的面向过程编程,面向过程强调的是过程和步骤,将问题分解为一系列的函数或过程,然后按照顺序依次执行执行函数来完成任务;而面向对象则是把问题域中的事物抽象成对象,每个对象都有自己的属性和方法,通过对象的交互来解决问题,具体细节呢见后文。
面向对象既然区别于面向过程,那肯定有它的特性,以Java为例,Java有封装、继承和多态三大特性,它们是面向对象技术的核心所在。此外,面向对象编程有七大设计原则,这是实现程序可维护性与可扩展性的重要法门,是前辈们长期实践得来的经验,在编程时应尽量遵守。
学习这门课的历程总结为一个字就是“累”,线上线下课双管齐下,每个礼拜定期的PTA大作业,还有实验,博客,以及运用JavaFX做一个航空管理系统,所以基本上每天我都要和Java和面向对象打交道,这些任务中PTA的作业难一点部分就在最开始的电梯,到后面难度还算好,实验也是逐渐迭代的一个过程,难度适中,就是最后做界面有点困难(因为对JavaFX还不太熟悉),但好在现在也算是熬到了课程结束,PTA题目集也是在坚持下没丢一分。算了,说多了都是泪😢。
但好在还是学到了一些东西,比如进行一些简单的类设计,熟悉了封装、继承和多态的内涵,了解了七个设计原则的概念与意义,还有集合框架的神奇和它的简单使用,以及23个设计模式中的三个(观察者模式、工厂模式和享元模式)等等。
面向对象技术总结
三大法宝
第一大法宝——封装:
-
概念:将类的属性和方法隐藏在类内部,通过访问修饰符(如public、private、protected)来控制外部对类成员的访问。
-
作用:提高了代码的安全性和可维护性,避免外部对内部数据的随意修改,同时也使得代码的结构更加清晰,使用者只需关注类提供的公共接口,而不必了解内部实现细节。
第二大法宝——继承: -
概念:一个类可以继承另一个类的属性和方法,被继承的类称为父类(超类),继承的类称为子类(派生类)。子类可以在父类的基础上进行扩展和修改。
-
作用:实现了代码的复用,减少了代码冗余,同时也体现了面向对象编程中的“is - a”关系,例如,子类“苹果”是父类“水果”的一种,子类会继承父类与水果相关的公共属性和方法。
第三大法宝——多态: -
概念:指在不同的情况下,一个对象可以表现出不同的形态。在Java中,多态主要通过方法重载和方法重写来实现。方法重载是指在一个类中定义多个同名方法,但参数列表不同;方法重写是指子类重新定义父类中已有的方法。
-
作用:使程序具有更好的扩展性和可维护性,提高了代码的灵活性和复用性。例如,不同子类重写父类的同一个方法,在调用该方法时,根据对象的实际类型来决定执行哪个子类的方法,这样可以在不修改原有代码的基础上,轻松添加新的子类实现新的功能。
七个“法则”
第一个法则——单一职责原则:
核心思想
一个类只负责一项职责,即每个类仅有一个引起其变化的原因。
示例
错误做法:一个UserService类同时处理用户认证、数据存储和业务逻辑。
正确做法:拆分为UserAuthService(认证)、UserRepository(数据存储)、UserBusinessService(业务逻辑)。
优势
降低类的复杂度,代码更易理解和维护。
减少变更影响范围,修改某一职责不会波及其他功能。
第二个法则——开闭原则:
核心思想
软件实体(类、模块、函数等)应对扩展开放,对修改关闭。即通过扩展而非修改原有代码来实现功能迭代。
示例
需求:实现不同图形的面积计算。
正确做法:定义抽象接口Shape,通过继承实现Circle、Rectangle等子类,新增图形时只需扩展子类,无需修改接口。
优势
避免修改原有稳定代码,降低引入 bug 的风险。
提升系统扩展性,符合 “可持续迭代” 的设计目标。
第三个法则——里氏替换原则:
核心思想
子类必须能替换其父类,且不影响程序原有功能的正确性。即子类需遵循父类的行为契约(方法参数、返回值、异常等)。
示例
错误做法:Square继承Rectangle,但重写setWidth和setHeight方法时破坏了 “宽高独立变化” 的契约(正方形宽高必须相等)。
正确做法:Square应独立设计,或确保重写方法不违反父类逻辑。
优势
保证继承体系的可靠性,避免因子类替换导致程序异常。
维护代码的可复用性和多态性。
第四个法则——接口隔离原则:
核心思想
客户端不应该依赖它不需要的接口。即接口应细化为多个特定功能的小接口,而非单一庞大的接口。
示例
错误做法:定义Animal接口包含fly()、swim()、run()方法,导致不会飞的动物(如猪)也必须实现fly()。
正确做法:拆分为Flyable、Swimmable、Runnable接口,动物根据特性实现对应接口。
优势
减少接口冗余,避免类实现不需要的方法。
提升接口的灵活性和可维护性。
第五个法则——依赖倒置原则:
核心思想
高层模块不应该依赖低层模块,两者都应依赖于抽象。
抽象不应该依赖于细节,细节应该依赖于抽象。
示例
错误做法:高层模块UserController直接依赖低层模块MySQLUserRepository(具体数据库实现)。
正确做法:定义抽象接口UserRepository,UserController依赖接口,通过依赖注入(如 Spring 框架)传入具体实现(如MySQL或MongoDB实现类)。
优势
降低模块间的耦合度,便于替换底层实现(如切换数据库)。
支持面向接口编程,提升系统的可测试性和扩展性。
第六个法则——迪米特法则:
核心思想
一个对象应该对其他对象有最少的了解(即 “最少知识原则”)。对象间的交互应尽量简单,不直接操作非直接关联的对象。
示例
错误做法:A对象直接访问B对象的成员变量,或通过B访问C对象(A→B→C)。
正确做法:A仅与直接关联的B交互,通过B的方法间接获取所需信息,而非直接操作C。
优势
降低对象间的耦合度,减少变更的连锁反应。
使代码结构更清晰,便于维护和扩展。
第七个法则——合成复用原则:
核心思想
优先使用组合(Composition)或聚合(Aggregation)而非继承来复用代码。
示例
错误做法:Car类继承Engine类(发动机),但 “汽车拥有发动机” 更适合用组合关系(Car包含Engine实例)。
正确做法:通过组合实现复用:public class Car { private Engine engine; }。
优势
组合关系比继承更灵活,避免 “继承泛滥” 导致的类层次复杂。
降低类间的耦合度,子类变更不会影响父类(继承则反之)。
总结:设计规则的核心目标
这七大设计规则围绕 “解耦、复用、扩展” 三大核心目标,通过规范代码结构和模块交互方式,帮助开发者构建更健壮、易维护的软件系统。实际开发中,需根据场景灵活应用,平衡设计复杂度与开发效率。
二十三个设计模式(仅介绍目前学过三个哦)
1、观察者模式
-
定义:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当主题对象的状态发生变化时,会自动通知所有观察者对象,使它们能够自动更新自己的状态。
-
应用场景:在消息订阅系统、事件驱动编程以及图形界面开发中,当一个对象的状态改变需要通知其他多个对象时,常使用观察者模式。
-
优点:实现了观察者和被观察者之间的解耦,提高了软件的可维护性和可扩展性。
-
缺点:如果观察者过多,可能会导致通知的效率降低。
2、工厂模式
-
定义:提供了一种创建对象的方式,将对象的创建和使用分离。通过一个工厂类来负责创建对象,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。
-
应用场景:在对象创建过程复杂,或者需要根据不同条件创建不同类型对象时,工厂模式非常有用,如根据不同的配置文件创建不同类型的数据库连接对象。
-
优点:将对象的创建逻辑封装在工厂类中,使代码更加清晰,便于维护和修改。
-
缺点:工厂类可能会变得过于复杂,当需要创建的对象类型过多时,工厂类的代码可能会变得臃肿。
3、享元模式
-
定义:运用共享技术有效地支持大量细粒度的对象。通过共享相同的对象实例,减少内存占用和对象创建的开销。
-
应用场景:在需要处理大量相似对象的场景中,如游戏开发中的大量角色、地图元素,或者文本处理中的大量字符对象等。
-
优点:大大减少了对象的数量,节省了内存空间,提高了系统的性能。
-
缺点:增加了系统的复杂性,需要分离出对象的内部状态和外部状态,并且对于不适合共享的对象,使用享元模式可能会带来额外的复杂性。
容器——集合框架
Java集合框架主要包含接口、实现类和迭代器三部分,以下是其体系结构的简述:
接口
-
Collection接口:是集合框架的根接口,定义了集合的基本操作方法,如添加、删除元素等。它有两个重要的子接口,分别是 List 和 Set 。
-
List接口:有序集合,允许元素重复,可通过索引访问元素。
-
Set接口:无序集合,不允许元素重复。
-
Map接口:存储键值对,键不能重复,值可以重复,通过键来访问值。
实现类
-
List接口的实现类:常见的有 ArrayList 、 LinkedList 。 ArrayList 基于数组实现,随机访问效率高; LinkedList 基于链表实现,插入和删除操作效率高。
-
Set接口的实现类:常见的有 HashSet 、 TreeSet 。 HashSet 基于哈希表实现,插入和查找元素效率高; TreeSet 基于红黑树实现,元素有序。
-
Map接口的实现类:常见的有 HashMap 、 TreeMap 。 HashMap 基于哈希表实现,能快速地根据键查找值; TreeMap 基于红黑树实现,键值对按照键的自然顺序或指定比较器顺序排序。
迭代器
- Iterator接口:提供了一种遍历集合元素的方式,通过 next 方法逐个获取元素,通过 hasNext 方法判断是否还有下一个元素。
Java集合框架体系结构清晰,不同的接口和实现类适用于不同的场景,方便开发者根据实际需求选择合适的集合类型来存储和操作数据。

总结:
通过一段时间对面向对象的学习,对于封装、继承、多态、抽象类、接口、集合框架、异常及JavaFX等一些内容,我都有了初步的了解,其中异常以及JavaFX掌握的还不是很好,第一是异常和JavaFX刚学没多久,还没怎么实操过,第二就是JavaFX的内容只是粗略讲了一下,还不能灵活运用,还得课后花一些时间去补补。
踩坑心得
1.学习完这门课后我深刻了解到了需求分析的重要性,这是老师一直强调的,也是在学习和做题过程中我慢慢体会到的,需求分析没做好,编写程序的不仅效率低,还非常容易出错,甚至到最后会功亏一篑,代码得推翻重做,就比如之前提到过的电梯编程,过程和需求没搞懂就开始写代码,到最后不仅没有后出手但需求分析做好的同学做得快,最终好不容易写出来的代码还是错的。
2.对于引用空指针的错误在学习过程中也是屡见不鲜了,通常发生在类属性是另一个类的对象时没有初始化对象,然后在引用这个类时就会出错;有的时候也会发生在定义一个抽象类的变量时未给这个变量赋初值(一般赋空)。
3.还有就是输入问题,就是在输入一个非nextLine()的数据后紧接着一个换行符和一个nextLine()的数据,这样就会出错,nextLine()读到的是一个换行符而不是要读取的数据,这时可以先用nextLine()消耗掉一个换行符,再读取数据。
改进建议及总结
总的来说,学习完这门课还是学到点东西,至少不像最开始学时对每个词都充满着深深的疑惑,应对编程题时也没有初学时那么迷茫和措手不及。
对课程的改进建议:实验提交系统不允许粘贴,只允许一个个打,不仅效率低,还非常容易出一些细指末节的错误,到后面运行后的错误基本上都是一些名的拼写错误导致的虽然说错误提示告诉了我们具体的行,但系统没有标行,需要所以错误行很难找到。
然后就是现在的运用JavaFX和文件操作做一个系统,虽然说不是技术上的难点,但它的内容庞大,还得去想怎么把它们结合运用起来,特别是还有把界面与底层逻辑融入到一起是很难的。也就是要先学一大堆,然后进行界面设计,底层代码设计,再将两者相融合,工作量很大,并且是初次接触在没有什么经验的情况下,所以我觉得可以给出更多的时间,以此来做出更好的系统。
浙公网安备 33010602011771号