导航

面向对象技术总结

Posted on 2025-06-17 20:22  又出bug了  阅读(13)  评论(0)    收藏  举报

一、前言

第三次blog作业,也是本学期最后一次。
在学习了面向对象程序设计课程后,学到了面向对象技术,其中也困惑过,也迷茫过,特别是在学习的后期,但还是咬着牙坚持了下来。
Blog作业: 工作量不怎么大(除了要满3000字以外),就是复盘 + 总结,感觉很枯燥乏味,就像高中写作文一样。
PTA作业: 工作量很合适,难度也在线,对自己的编程能力和编程思维有很大的提升,在写PTA作业途中也慢慢体会到了编程正确的快感。
实验: 实验内容很好,很贴合所学知识,但是实验提交令人咂舌,是在学校老师自己做的“实验提交系统”上提交实验,而且不能“复制粘贴”,没有格式化源码等操作,出现了错误还要一行一行检查,很浪费学生时间,我是来学编程的,不是来码字的(虽然学生的码字速度很慢)。
线上、线下课程: 线下课程没得说,都靠线下白手起家的,就是有时候不知道讲到哪里了(因为不按照书本来讲)。线上课程就是对线下课程的补充以及一些习题,像继承、多态、抽象类、接口、List、面向对象设计原则、正则表达式和实验内容等等,实验内容与实际实验稍微有不同,毕竟课程是几年前的,实验也会新加需求。

二、面向对象技术总结

封装

封装的使用无疑是最频繁的,它将属性和行为捆绑在一个类中,并隐藏对象的内部实现细节。通过访问修饰符(private, protected, public, default)控制对类成员的访问级别。一般地,设计类都是private的属性 + public的getter/setter。比如设计一个圆类Circle,我们会把它的半径radius属性私有化,使用共有的getter和setter来获取和修改属性,防止外部代码直接、意外地修改内部数据,保证数据的完整性和一致性。封装提高了代码的可维护性,将代码组织成高内聚、低耦合单一职责原则SRP)的模块。

继承

一个类(子类)能继承另一个类(父类)的属性和方法,通过使用关键字extends实现。子类方法的修饰符的权限要比父类低。Java只支持单继承,一个子类只能继承一个父类;但可以通过继承多个接口实现多继承。比如设计一个球类Ball,刚好就能继承自Circle类,在子类构造方法的第一行使用关键字super调用父类的构造方法,也能用super访问父类的成员。子类也能Override覆写父类的方法。在刚接触继承的时候,我还是有点半懂不懂,在汽车挡风玻璃雨刷的类设计上没少撞壁,也是在后面的慢慢摸索才理解其中的原理。使用继承能够实现代码复用,但主要用于扩展(与多态一起),代码复用应优先使用聚合或者组合(合成复用原则CRP)。

多态

多态指不同对象接收到相同消息时会产生不同行为。具体来说,允许使用父类类型的引用指向子类对象,并且通过这个引用调用方法时,实际执行的是子类重写的方法。比如Shape shape = new Circle(),当我运行shape.getArea()时,JVM 在运行时(而非编译时)根据引用实际指向的对象类型来决定调用哪个方法,所以实际上调用的是Circle类中的方法,而不是Shape类的(里氏代换原则LSP)。那么多态要建立在继承基础上,而且子类一定要覆写父类的方法,通过向上转型将子类对象赋值给父类类型的引用。多态提高了代码的可扩展性,实现了代码通用型和接口统一。

抽象类

抽象类是使用abstract关键字修饰的类。抽象类不能实体化对象,所以只能被继承。抽象类可以没有抽象方法,但有抽象方法的类一定是抽象类。抽象方法必须在子类中实现,否则子类仍然是抽象类。比如我们设计一个抽象类Shape,抽象方法:public abstract double getArea();(没有 {})。抽象化是实现开闭原则OCP的关键(此外还需要对可变性封装),里氏代换原则是实现抽象化的一种规范。

接口

接口使用interface关键字定义,是一种完全抽象的类型(在Java 8之前),主要定义一组方法签名和常量(默认省略修饰符)。类继承接口通过implements关键字实现,一个类可以实现多个接口,这样便有了Java中的多继承。比如我们有Comparable接口,只有一个抽象方法compareTo(),抽象类Shape通过比较两个Shape对象的面积来实现它。依赖倒转原则DIP的中心思想就是面向接口编程,抽象不应该依赖于细节,细节应该依赖于抽象。设计接口时要精简单一,遵循接口隔离原则ISP。接口实现了多继承,分离了“做什么”和“怎么做”(解耦),提高代码灵活性和可扩展性,实现多态。
抽象类与接口的区别:

  1. 抽象类是对事物的抽象,接口是对行为的抽象;
  2. 接口的抽象级别在抽象类之上;
  3. 抽象类名一般是名词,接口一般是形容词。

集合框架

集合框架Java提供的一套用于存储和操作对象组(集合)的标准接口和类库。
核心接口有Collection<E>Map<K, V>,而Collection<E>又有主要子接口List<E>Set<E>Queue<E>
List<E>:有序集合(插入顺序),允许重复元素,允许null。可以通过索引index访问元素。主要实现类有ArrayList, LinkedList, Vector (古老, 线程安全), Stack (继承自 Vector)。在PTA作业和实验中经常使用ArrayList和LinkedList,足以见得其强大之处,而Vector、Stack以及下面的Set、Queue和Map都是老师在最后一节课讲的,差不多一笔带过,所以没有完全掌握。
Set<E>:不允许重复元素的无序集合,允许null(但最多一个)。主要实现类有HashSet, LinkedHashSet, TreeSet (有序)。
Queue<E>:队列,通常遵循 FIFO(先进先出)。主要实现类有LinkedList, PriorityQueue。PTA作业的电梯调度问题应该可以使用Queue来解决,但是在类设计中要设计Queue类。
Map<K, V>:存储键值对 (key-value pairs)。键(K)不允许重复,值(V)可以重复。允许null键和null值。主要实现类有HashMap, LinkedHashMap, TreeMap (按键排序)。在PTA作业中记录53个Java关键字的出现次数可以使用Map做出,但我用的是两个定长数组,一个是存放53个关键字的String[](已经按照字母大小顺序排列),另一个是记录index对应关键字出现次数的int[],也差不多摸清了Map的原理。
工具类有CollectionsArrays
Collections:提供操作集合的静态方法,如排序 sort, 查找 binarySearch, 反转 reverse, 打乱 shuffle, 创建同步/不可变视图。PTA作业和实验中也会经常使用Collections的sort()方法。
Arrays: 提供操作数组的静态方法,如排序 sort, 二分查找 binarySearch, 填充 fill, 转列表 asList。
对于Set、Queue、Map和工具类掌握得不充分,在今后的学习中要逐渐掌握,方便高效解决问题。

异常

异常是运行时错误,异常处理是Java提供的一种健壮的错误处理机制,用于处理程序运行时发生的非预期事件(错误、异常),防止程序非正常终止,并提供错误恢复或优雅终止的途径。异常有ErrorException,Error通常不可解决,所以异常处理解决的是Exception。
throws:在方法声明中指明该方法可能抛出哪些检查型异常。
throw:在方法内部手动抛出一个异常对象。
try:定义可能抛出异常的代码块。
catch:捕获并处理特定类型的异常。可以有多个catch块,捕获更具体的异常应放在前面。
finally:无论是否发生异常,finally块中的代码总是会被执行,常用于释放资源,如关闭文件、数据库连接。
异常知识也是在最后一节课稍微讲了讲,没有实战训练,不过所有PTA作业中的Wrong Format可以通过异常处理的方式解决。

JavaFX

JavaFX是开发Java GUI程序的新框架,旨在取代老旧的Swing和AWT。在最后一次实验和GUI作业中有运用到JavaFX的许多组件。下面是实验的一个场景图

由于这部分内容是学生讲,所以有很多复杂的地方都是不太了解,后续还要投入时间学习。

三、采坑心得

弯路

  • 需求分析不完善,PTA题目上汽车雨刷问题,需求要使用封装、继承、多态、抽象类和接口,而实际上却只使用了封装,后面改代码又花费很长时间在研究继承。
  • 继承的课程没有好好听,导致super是干嘛用的、怎么用的都不知道,也就被反反复复折磨,汽车雨刷问题的重复代码占了一半左右,当时也是不知道把父类的属性设为protected,导致子类和父类有相同属性和方法。
  • 忽视单一职责原则,电梯调度问题的寻找下一个目标getNextTarget()写了一百行,if-else嵌套太多,逻辑复杂,严重违背了单一职责原则,而且情况也没有全部考虑到。
  • 缺乏对正则表达式的了解,在记录53个关键字的出现次数中,用一个方法去掉所给代码中的所有标点,解决“[]以及,分隔”的测试点,用\W不能通过,用\p{P}就能通过了,翻书看这两个表达的意思不是一样的吗,对这个的了解还是知之甚少。

经验教训

  • 仔细分析需求,仔细审题。活了二十来年了还不会审题,这辈子都没救了。。。
  • 上课认真听讲,课后及时复习。遇到不懂的地方可以问老师,可以问同学,甚至可以问deepseek,不要等到做题目时才发觉,这个不会那个不会。
  • 遵循面向对象设计原则。有时候会忘记哪个地方应该遵循什么原则,还是没有把设计原则内化于心外化于行。
  • 自学能力。JavaFX的大部分内容都是学生讲的,都讲的不到位,所以不要只学自己讲的那一部分内容,所有内容都应该要学习,即使没有老师的讲解。

四、改进建议及总结

面向对象程序设计作为软件工程的专业基础课,南昌航空大学的教学质量向北京航空航天大学看齐,采用同一本教学教材和同一种教学方式,所以我在学的过程中也是感到课程的质量很足,体会到面向对象编程的强大之处。
对课程的改进意见:讲课稍微指点一下讲到书本上哪里了,PTA作业的需求不要这里一块那里一块,实验系统可以有改进,比如高亮显示错误或注意,线上课程可以更新内容。