第三次Blog作业——总结性Blog
前言
整门课程的Blog作业有三次,第一次是分析单部电梯调度程序,三次电梯题目迭代,难度较难。第二次是分析航空货运管理系统,两次航空货运题目迭代,难度较难。第三次则是本次总结性Blog作业。本门课程的PTA题目集共有11个,难度随着题目集的增加而增加,起初是入门和简单难度,后期变为中等和较难的难度。
本门课程的实验共有五次,前两次的实验难度较为中等,后面难度增加,完成起来较为困难。线上课程需要观看引言,七章以及附加两章的课程视频,且大多每个视频后都要完成当堂作业或讨论。线上课程难度不大,是为了线下课程打下基础,可作为线下课程上课之前的预习。本课程的线下课程内容充实,难度比线上课程的难度要大,且课程后期涉及到翻转课堂,对学生自主学习能力的要求更高。
面向对象技术总结
第一次实验学习到编译环境的下载与安装使用,能够编写基础代码。第一次的PTA作业是线上课程第一章“程序设计基础”配套的练习题,主要考察基础java语法的掌握情况。通过这次作业我已基本掌握java语法与C语言语法的不同之处,且能够使用java进行基础语法编程。第二次PTA作业的题目难度比第一次的作业难度稍大一点,为了强化基础编程能力。这两次作业都是在线下课程之前发布,对课程的过渡有很大的帮助,使我对本门课程有了初步的认知和更多的了解。
第三次PTA作业主要考察对数组的处理和三种排序方法的使用,通过这次我学会了判断两个一维数组是否完全相同,学会合并数组并在数组中排序。在这次作业中我还掌握了对插入排序,选择排序和冒泡排序三种算法对整型数据进行排序。
封装:第四次PTA作业和第二次实验开始考察类与对象,在这之中我知道了如何为对象定义属性和方法。首先定义类和使用类创建对象,而后使用构造方法构造对象(我知道构造方法分为有参和无参,类中会隐式定义一个方法体为空的无参构造方法,但是老师却建议我们无论怎样都要自己创建一个无参构造方法),再通过引用变量访问对象(对象的数据和方法可以使用点操作符(.)通过其引用变量进行访问)。我还了解了可见性修饰符的使用以此来为数据域的封装打下基础(将数据域设为私有可以保护数据,并且使得类易于维护),使用this引用数据域和调用构造方法。经过这次作业我初步学到类的各种知识,学会在主类之外创建一个新的类并在主类里创建该类的对象,调用该类的方法以实现不同的功能满足不同的需求。我深刻理解了封装作为面向对象基础原则的重要性。封装将数据与操作数据的方法绑定,通过访问修饰符控制可见性。较好理解了封装理念,能够合理使用private/protected/public控制访问级别。但在复杂系统设计中,有时对哪些属性方法应该暴露把握不够准确。
第五次PTA作业接着考察类的设计,正则表达式的使用。正则表达式的题目是结合线上课程所出的题目,在线上课程正则表达式的学习中,我学会了如何提取文本中所有的英文单词,所有的关键字,删除代码中所有的注释。但是在题目中所考察的QQ号校验需要检验输入的数字必须要是5到15位,在课程学习之外就得靠我去自学。该题目集的最后一题给了我当头一棒,这道题目的难度老师的定义是中等,对于我这个半吊子来说却已是较难的。这题考察我们根据需求类设计的能力,我们需要首先弄清楚电梯外部请求与内部请求的优先性,判断电梯下一步的运行方向以及是否要开门,具体实现过程中的难点还有如何从内部和外部请求中移除已完成的请求。在单部电梯调度程序中我学到了如何合理满足需求,创建不同的方法,确定哪种方法实现什么样的功能。
第六次PTA作业仍然是考察类的需求设计,不同的是我们需要考虑类是否满足单一职责原则。点与线,汽车风挡玻璃雨刷题目难度中等,所要实现的功能也是一目了然。最值得一提的还是最后单部电梯调度问题的迭代,鉴于单一职责原则的遵循,这题需要设计多个不同的类实现不同的职责。通过这次作业我明白了何为单一职责原则,在类的设计上追求更为合理,每个类只实现一个功能不允许实现多种功能,有利于提高代码的可读性和可维护性。第七次PTA作业在第六次的基础上做了迭代,还是注重单一职责原则。
继承与多态、接口与抽象类:第八、九次PTA作业和第三次实验涉及到继承与多态,使用到抽象类。第十次PTA作业和第四次实验则是更多地涉及到接口和排序功能的扩展。继承机制让我实现了代码的高效复用。在点线面问题重构中,通过Element基类派生出Point和Line和Plane子类,同时学习了方法重写、super关键字的使用,以及继承链中的构造方法调用顺序。能够建立合理的继承关系,理解"is-a"原则。但对多层继承的设计(何时需要中间抽象层)还不够熟练,有时会导致类层次过深。多态是让我收获最大的概念之一。通过PTA的图形计算题目,我实践了父类引用指向子类对象,实现了统一接口处理不同图形(圆、矩形等)的面积计算。结合方法重写和动态绑定,使代码扩展性大大增强。理解运行时多态机制,能够应用接口和继承实现多态。但对编译时多态(方法重载)与运行时多态的区别偶尔混淆,需要加强理解。在实验动物装进容器中,使用抽象类Animal定义抽象方法Cry(),由具体子类实现。接口方面,通过Comparable接口实现对象排序,通过自定义Aggressive接口实现"攻击性"的能力组合。理解抽象类定义部分实现而接口纯粹定义契约的区别。能够合理选择使用场景,但对接口默认方法和静态方法的运用还不够熟练。
集合框架:题目集十的最后一题综合考察了面向对象的继承、多态、抽象类以及集合框架的使用。通过实现ShapeUtil工具类,我深入理解了Java集合框架在实际项目中的应用方式。能够熟练使用ArrayList的add、遍历等基本操作,理解Comparable接口的作用,能够正确实现compareTo方法,理解泛型在集合中的重要性,能够正确定义泛型集合。虽然会使用Comparable,但对Comparator的使用场景不够清楚,不熟悉多条件排序的实现。通过这道题目的实践,我对Java集合框架有了更深入的理解,特别是集合与面向对象特性的结合应用。ArrayList作为最常用的集合,其基本操作已经掌握,但在复杂业务场景下的集合操作能力还有待提高。
javaFX:实验五主要考察javaFX,通过本实验,我掌握了JavaFX的基本架构和工作原理。理解其基于场景图(Scene Graph)的UI构建方式,能够清晰区分Stage(舞台)、Scene(场景)和Node(节点)三者的层级关系。在实际项目中,能够正确搭建JavaFX应用程序的基本框架,初始化主舞台并设置场景。熟练使用常见的布局管理器如BorderPane、HBox、VBox等构建用户界面。能完成基本界面布局,但对GridPane等复杂布局的使用还不够熟练。深入理解了JavaFX的事件驱动编程模型,能够为各种UI控件添加事件监听器。掌握基本事件处理,能够处理鼠标、键盘等常见事件。但对事件冒泡和捕获机制理解不深,自定义事件的应用经验较少。掌握了JavaFX提供的各种形状类,包括Rectangle、Circle、Line等。能够创建基本图形并设置其样式属性。高级动画效果中对Timeline、Transition等动画类的使用不够熟练,复杂动画实现困难。我已经掌握了JavaFX的基础知识和核心开发技能,能够独立开发基本的图形界面应用程序,界面布局和基本图形绘制能力达到实用水平。然而,在高级功能和架构设计方面还存在明显不足,下一步将重点突破动画效果、自定义控件和数据可视化等进阶内容。
踩坑心得
在学习面向对象编程的整个过程中,我走过不少弯路,也积累了许多宝贵的经验教训。从最初的懵懂到逐渐理解各个核心概念的内在联系,这一路充满了试错与成长。在封装方面,刚开始我常常把类的属性都设为public,觉得这样访问方便,直到在一个项目中因为随意修改对象状态导致难以追踪的bug,才真正体会到封装的重要性。后来我学会了合理使用private和protected,通过getter和setter方法控制访问,这不仅提高了代码的安全性,也使类的职责更加清晰。但我也曾走入另一个极端——过度封装,把本应内聚的逻辑强行拆分到多个类中,导致代码过于碎片化。经过几次重构后才找到平衡点,明白封装不是目的,而是手段,关键在于找到合理的抽象层次。
继承是另一个让我又爱又恨的特性。刚开始使用时,我热衷于构建深层次的继承体系,觉得这样能最大化代码复用。后续一系列经历让我深刻理解了"组合优于继承"的原则,也学会了使用接口来定义行为而不是依赖类层次结构。
抽象类和接口的选择也曾让我纠结很久。在动物进入容器的实验中,我最初用抽象类定义动物的攻击性,但随着需求变化,发现有些功能并不适合所有子类。后来改用接口组合的方式,定义Aggressive等小粒度接口,灵活性大大提高。这次经历让我明白抽象类适合定义模板方法和不变量,而接口更适合描述能力。集合框架的学习曲线比想象中陡峭。记得第一次使用ArrayList时,我直接在循环中删除元素,结果遇到了ConcurrentModificationException。通过这个错误我学会了使用Iterator的正确方式,也理解了fail-fast机制的意义。
异常处理看似简单,但我也踩过不少坑。早期我常常捕获异常后简单打印堆栈就了事,导致上层无法感知和处理错误。后来改进为根据业务含义封装自定义异常,但又不小心创建了过多的异常类,使代码变得臃肿。经过多次调整才找到平衡——只对真正需要特殊处理的场景定义新异常,大多数情况使用标准异常并添加有意义的错误信息。
JavaFX的学习过程同样充满挑战。在布局方面,早期我过度依赖绝对定位,结果在不同分辨率下显示错乱,改用锚点布局和弹性盒子后才实现真正的响应式设计。事件处理看似简单,但事件冒泡和过滤机制曾让我困惑,直到在一个复杂表单项目中深入使用才真正掌握。
回顾整个学习历程,最大的教训是不要停留在表面理解。比如学习多态时,仅仅知道"父类引用指向子类对象"是不够的,必须通过实际项目体会它在框架设计中的威力。另一个重要体会是设计需要适度,既不能过度工程化,也不能缺乏规划。我曾经为了追求"完美设计"而引入不必要的模式,结果使简单问题复杂化;也曾在时间压力下写出面条式代码,后期维护困难。现在我会先做最小可行实现,然后随着需求演进不断重构。调试能力的提升也是重要收获。从最初的盲目修改到学会使用断点、日志和单元测试定位问题,这个转变大幅提高了我的开发效率。特别是在处理集合和并发问题时,良好的调试习惯能节省大量时间。
总结
通过本门课程的系统学习,我在面向对象编程方面建立了完整的知识体系,从基础的封装、继承、多态三大特性,到更高级的抽象类、接口设计,再到集合框架、异常处理和JavaFX图形界面开发,形成了渐进式的学习路径。在实践过程中,我深刻体会到面向对象思想的核心价值。封装教会我信息隐藏和模块化设计的重要性,使代码更健壮、更易维护;继承和多态让我理解代码复用的艺术,以及如何构建灵活可扩展的架构;抽象类和接口则展示了契约式编程的威力,为系统设计提供了清晰的规范。集合框架的学习使我掌握了Java中强大的数据结构和算法工具,异常处理机制培养了我编写健壮代码的意识,而JavaFX的实践则让我体验到GUI开发的完整流程,从界面设计到事件处理,从布局管理到数据绑定。初期过于关注语法细节而忽视设计思想,导致写出的代码虽然能运行但缺乏良好的面向对象特性。后来通过实践才真正理解"针对接口编程"、"开闭原则"等理念的价值。这门课程不仅教会了我Java语言和面向对象技术,更重要的是培养了一种编程思维方式和软件设计理念。这些知识和经验将成为我后续学习框架、参与项目开发的坚实基础。面向对象编程是一门需要持续实践的技艺,我会在今后的学习中不断深化理解,将课程所学应用到实际开发中,写出更优雅、更健壮的代码。
建议:面向对象设计特别适合团队开发,建议增加小组项目,模拟真实开发环境中的协作场景。

浙公网安备 33010602011771号