第三次博客作业
📚 Java面向对象编程课程总结与心得
一、前言
本学期JAVA课程也接近了尾声,感觉这个学期JAVA课程作业和教学形式都比较丰富哈,要求也比较严格,接下来做一个概览总结。
1. 线上和线下课程
线上线下的课程结合,相互补充,需要我们自觉去线上课程中补充线下没学好的内容,而且线上课程也有对平时作业、实验的一些提示思路讲解,比较灵活,方便我们自主学习吧,线上课程如果讲的更通俗些会更好。
2. PTA
每次PTA的作业都是与教学内容紧密相连,每一个题集中的题目遵循层层递进、由易到难的原则,锻炼我们的编程和思维能力,从基础的类封装起步,逐步引入更复杂的继承关系和多态行为,最终过渡到综合性较强的系统设计模拟。题目覆盖了OOP的核心知识点,并注重实践应用能力的培养。
(1)基础类设计
工作量相对较小,主要聚焦于单一类的属性定义、方法实现(构造、getter/setter、核心功能方法如计算距离 / 面积)和封装性。需要仔细理解问题描述,设计合理的成员变量和方法签名。
(2)迭代题目(继承与多态)
工作量显著增加。需要在理解原有类的基础上,设计合理的类层次结构(父类、子类);运用继承复用代码,同时使用多态(虚函数 / 抽象类)实现不同子类对象通过父类指针 / 引用的统一操作(如计算不同形状的面积);仔细考虑类之间的关系(is - a关系),设计虚函数或纯虚函数接口。
(3)综合系统设计(如"航空系统")
工作量较大,需设计多个相互关联的类(如航班Flight、乘客Passenger、票务Ticket、航空公司Airline等),清晰定义各个类的职责(单一职责原则),设计类之间的关系(关联、聚合、组合等),例如一个Flight包含多个Ticket,一个Ticket关联一个Passenger;设计类之间的交互方式(方法调用),实现系统的核心业务流程(如订票、退票、查询等),处理业务规则和边界条件(如座位是否重复、票数是否足够等),对整体架构设计能力要求高。
3. 实验
实验围绕"动物装入电器"这一核心场景,逐步深化面向对象编程(OOP)的理解与实践,显著提升代码设计与实现能力。实验以"动物装入电器"为主线,循序渐进地带我们实践面向对象编程的核心内容:
- 实验二从最基础的"冰箱"和"动物"类开始,学习用代码描述现实事物,并通过手动实现排序算法加深对数组操作的理解;
- 实验三结合继承和多态知识,构建电器家族(冰箱、洗衣机)和动物家族(大象、老虎)的层次关系,实现"一个方法,多种表现"的多态特性,不同动物进入电器时的独特叫声让抽象概念直观可见;
- 实验四通过定义"可攻击"接口和抽象电器类,直接使用Java内置的Collections.sort()排序,规范代码结构的同时学会使用集合工具简化开发;
- 实验五通过GUI章节学习,将之前所有业务逻辑用可视化界面呈现,通过点击操作让动物"活"起来,深入理解事件驱动编程。
二、面向对象技术总结
1. 封装
掌握情况:通过实验二(冰箱与大象类设计)和PTA类设计题目,熟练使用private封装属性,并通过getter/setter方法控制访问,理解封装对数据安全性和代码可维护性的重要性。
认知:封装这个概念,我最开始的理解就是把数据藏起来。就像实验二中设计冰箱类时,我把冰箱的容量、开关状态等属性都用private修饰,这样外部就不能直接修改这些属性。后来在做PTA"线与面"题目时,我意识到封装不仅仅是隐藏数据,更重要的是定义清晰的访问接口。比如在点类中,我通过public的getX()和getY()方法来获取坐标,这样既保证了数据安全,又提供了统一的访问方式。
2. 继承与多态
掌握情况:实验三(动物与电器继承体系)掌握类继承(extends)和方法重写(@Override),能通过父类引用调用子类方法(多态),PTA"线与面"迭代设计强化该能力。
认知:继承和多态这两个概念,我是在实验三"动物与电器"的题目中真正理解的。设计动物类继承体系时,我把共同的特征放在Animal父类中,比如name和weight属性,而各个子类实现自己特有的行为。这让我深刻体会到"代码复用"的好处。多态的特性在PTA"图形面积计算"题目中给了我很大启发。定义一个Shape父类,让Circle和Rectangle继承它,这样在计算总面积时,可以统一处理Shape数组,而不用关心具体子类类型。这种设计让代码更加灵活可扩展。
不足:复杂继承层次(多层继承 + 接口实现)设计经验少,易混淆方法调用优先级。
3. 抽象类与接口
掌握情况:实验四通过抽象类(如Animal)定义共性方法,用接口(如Attackable)规范行为,理解"抽象类侧重共享代码,接口侧重功能扩展"的区别。
认知:抽象类像"动物都要吃饭睡觉"的通用模板,接口像"会飞"这种额外技能,谁需要谁实现,抽象类像"半成品",如Animal定义抽象eat()方法,强制子类实现;接口则是"能力证书",如Swimable表示会游泳。它们的关系就像"身份证"和"技能证书"——一个表明身份,一个证明能力。用抽象类提取公共代码,用接口扩展功能(如"可攻击"接口)。接口是面向对象设计的关键,能够实现松耦(如Comparator排序)。
不足:对接口默认方法(default)和静态方法的使用场景不熟悉。
4. 集合框架
掌握情况:实验四用ArrayList管理动物集合,熟练使用Collections.sort()配合Comparator排序,替代实验二手动排序算法。
认知:ArrayList/LinkedList的自动扩容特性解决数组越界问题,Collections.sort()配合Comparator比手动排序更简洁:
// 冰箱类内部管理大象集合 private ArrayList elephants = new ArrayList<>();
相比普通数组,无需提前设定大小,自动扩容更省心;实验四动物战斗力排序:
Collections.sort(animals, new Comparator() { public int compare(Animal a1, Animal a2) { return a1.getPower() - a2.getPower(); } });
常用核心操作:
1.添加元素:add()
实验三往电器里装动物时使用
获取元素:get(index)
PTA"线与面"题目中遍历图形集合
2.删除元素:remove()
实验四处理动物互相攻击时移除被吃掉的动物
3.遍历集合:
for(Animal animal : animalList){
animal.show();
}
不足:对Map(如HashMap)和复杂集合操作(如流式处理)掌握不深。
5. 异常处理
掌握情况:仅通过PTA题目接触基础异常(如NullPointerException),能使用try - catch处理简单异常,缺乏系统实践。
认知:异常用于处理程序非正常流程,但过度捕获会掩盖问题。
不足:自定义异常、异常链传递等高级用法不熟悉,复杂场景(如IO操作)的异常处理经验不足。
6. JavaFX
掌握情况:理解JavaFX核心(声明式布局 + 事件响应 + 数据绑定),实验五实现基础GUI(按钮点击事件、动物移动动画),掌握事件驱动模型(EventHandler)和Lambda表达式简化代码。
认知:
JavaFX实验5中,我通过构建"动物进入电器"的交互式可视化界面,深入掌握了GUI开发的核心技术要点。这个项目让我从零开始实践了完整的界面开发流程,收获颇丰。
在UI构建方面,我熟练运用了VBox、HBox和GridPane等布局容器,通过合理的嵌套组合实现了清晰的界面结构。特别是电器选择区和动物网格区的排版设计,让我深刻理解了padding和spacing参数对界面美观度的重要影响。同时,Scene和Stage的层级关系也变得更加清晰,认识到一个Stage代表应用程序窗口,而Scene则是其中可替换的内容容器。
事件处理部分让我获得了宝贵的交互设计经验。通过selectedAppliance和selectedAnimal两个状态变量的管理,实现了"先选电器再选动物"的流程控制。在调试过程中,我深刻体会到防御性编程的重要性,比如必须对用户操作进行合法性校验,避免出现NullPointerException等运行时错误。这些实践让我对事件驱动编程有了更直观的认识。
动画效果的实现是本项目的亮点之一。通过PathTransition和ScaleTransition的组合使用,我创造了流畅的动物移动效果。在优化过程中,我发现动画时长需要精细调整:1.5秒显得拖沓,0.8秒配合Interpolator.EASE_BOTH缓动曲线则恰到好处。ParallelTransition的使用让多个动画能够同步执行,而半透明预览(setOpacity)的引入则显著提升了用户体验。
不足:复杂布局(GridPane嵌套)、CSS美化、多线程更新UI等需依赖外部资源。
三、踩坑心得
1. 前期规划不足:思路混乱的惨痛教训
刚开始学习Java时,我总是急于动手写代码,结果常常陷入"写了删、删了写"的恶性循环。有一次做课程设计,我直接开始写学生管理系统,写到一半才发现数据结构设计有问题,导致整个查询模块都要重写。这让我深刻认识到:没有清晰的规划,代码就像没有地基的房子,随时可能倒塌。
2. 类职责混乱:面向对象思维的缺失
刚开始我总是把各种功能堆在一个类里,比如把数据存取、业务逻辑和界面显示都塞进Main类。结果这个类越来越臃肿,修改一个功能就可能影响其他完全不相关的部分。后来学习了单一职责原则,我才明白每个类应该只做一件事,并且把它做好。
每个类应只做一件事,并且做好。
3. 参数传递的陷阱:引用与值的困惑
在方法传参时,我经常搞混值传递和引用传递的区别。有一次我修改了传入的List参数,没想到原始数据也被改变了,导致系统出现难以追踪的bug。这让我学会了防御性编程,重要参数一定要先做拷贝再处理。
4. 封装性的破坏:自作聪明的代价
为了图方便,我经常把类的字段设为public直接访问,结果当需求变更时,需要修改所有直接访问这些字段的地方。有一次修改一个字段名,竟然要改20多个文件!这让我深刻理解了封装的重要性,现在我会严格使用getter/setter方法。
使用getter/setter。
5. 异常处理的误区:从忽视到过度
刚开始我习惯用try-catch吞掉所有异常,导致问题被掩盖。后来我又走向另一个极端,在每个方法上都throws Exception。直到系统上线后出现各种奇怪的错误,我才学会要区分检查异常和运行时异常,合理处理不同类型的错误。
6. 测试的觉醒:从形式到实质
以前我觉得写测试是浪费时间,直到有一次修改了一个简单方法,却导致系统核心功能崩溃。现在我坚持TDD(测试驱动开发),先写测试用例再写实现代码,这不仅提高了代码质量,还让我的开发效率更高了。
高代码质量的同时提升开发效率。
7. 代码风格的进化:从随意到规范
早期我的代码缩进混乱,命名随意,两周后自己都看不懂。经过团队合作项目的"毒打"后,我现在严格遵守代码规范,使用有意义的命名,保持一致的代码风格,这让我的代码可读性和可维护性大大提升。
总结:成长是一个持续的过程
这些踩坑经历让我明白,编程不仅是一门技术,更是一种思维方式的培养。从最初的"能跑就行",到现在注重可读性、可维护性、可扩展性,我的编程思维在不断成熟。每个bug都是一个学习机会,每次重构都是一次进步。保持学习的心态,持续改进,才能在这个快速发展的行业中不断成长。
四、改进建议及总结
1. 学习总结
随着课程的推进,逐渐从编写简单的控制台程序,到尝试搭建小型项目,每一次代码的成功运行都带来满满的成就感,让我对Java编程的热情愈发高涨。在整个学习过程中,通过理论课程的学习与实践操作的结合,我系统地掌握了Java编程的基础架构与逻辑思维方式。课堂上老师的讲解让我对Java的整体框架有了清晰的认知,课后的作业和实验则让我将所学知识运用到实际场景中,在解决问题的过程中编程能力得到切实提升。与同学的讨论合作碰撞出思维火花,从不同角度加深了对Java编程的理解。这段学习历程不仅让我收获了专业知识,更培养了独立思考、解决问题的能力,以及面对编程难题时的耐心与毅力。
2. 改进建议
(1)作业布置:建议减少作业量,太多作业会降低对课程的学习热情 .
(2)教学内容:希望融入更多新颖案例和前沿技术应用,如结合热门互联网项目、大数据处理或人工智能领域的Java应用案例,让我们直观感受Java在实际工作场景中的价值。穿插编程行业动态、Java职场发展方向等"题外话",分享Java工程师职业发展路径(全栈开发、后端架构师、云计算工程师等),帮助规划职业道路。
(3)讲解方式:部分知识点讲解较抽象,建议采用更通俗的语言,多运用生活实例类比(如面向对象编程类比现实模板),对比不同概念差异帮助理解。讲解新技术或复杂概念时适当放慢节奏,增加互动环节,及时解答疑问,确保学习效果。