面向对象课程设计总结Blog

一、前言

  1. Blog作业的难度工作量适中,难度也不大,但是对于语言的概况能力和表达能力有很高的要求,很多时候需要考虑怎么样才能将自己遇到的错误和吸取到的教学简单易懂的表达出来。极大地锻炼了逻辑梳理与通俗表达能力。
  2. PTA 作业呈现出 "两极分化" 的特点:大部分题目聚焦基础语法,难度适中,适合巩固课堂知识;但部分进阶题目涉及复杂逻辑设计,对我们而言存在较大挑战。前期打基础阶段,由于需要反复练习循环、条件判断等基础结构,作业量相对密集;而进入后期学习设计模式、架构理念时,PTA 题目却缺乏对应的实践场景。
  3. 实验的难度适中,工作量也适中。实验是检验自己学习成果中很重要的一环,我们只有完成实验才标志着我们能够将学习到的内容运用到实践之中。
  4. 线上课程的难度偏低,工作量适中。因为线上课程的主要作用是给我们打基础用,所以我认为线上课程现在的难度和工作量是十分合理的。
  5. 线下课程的难度偏高,工作量适中。线下课程主要讲解的都是一些比较抽象的东西,例如设计思想和设计理念,我觉得这部分内容也可以做进线上课程中,给我们作为课前了解或者课后复习使用。

二、面向对象技术总结

1.封装:

封装的核心是将类的属性私有化(private修饰),通过getter/setter方法暴露访问接口,确保数据安全性和一致性。例如, “学生信息管理” 作业中,将Student类的年龄属性设为private,并通过setAge()方法添加合法性校验。封装是面向对象的基础,本质是 “信息隐藏”,使外部仅能通过预设接口操作对象,降低模块间耦合度。封装的深层价值在于建立 "数据访问的准入机制"。封装不是简单的private+getter/setter,必须在接口层添加业务规则校验,否则 “封装” 会变成 “数据污染的保护伞”。

2.继承:

继承能实现简单继承体系,完成实验中的类层次设计。继承体现 “is-a” 关系,是代码复用的重要手段。但对继承中的构造器调用顺序(子类初始化时父类构造器的执行逻辑)理解不够深入,复杂继承链调试时易出错。了解到子类构造器第一行必须调用父类构造器(默认调用无参构造器),若父类无无参构造器,必须显式用super()指定;重写方法需严格遵循 “三同一兼容” 原则(方法名、参数、返回值类型兼容,访问修饰符不更严格)。

3.多态:

理解方法重载、方法重写和父类引用指向子类对,并且能在代码中应用。学习到了动态多态的实现条件:继承 / 接口实现、方法重写、父类引用指向子类对象。了解到多态是面向对象的核心特性,使程序具备 “同一接口,不同实现” 的灵活性,便于扩展(如新增Triangle子类时无需修改上层代码)。但是对多态与泛型(如List中存储不同子类对象)的结合应用不够熟练,复杂泛型场景下类型转换易出错。

4.抽象类与接口:

能区分两者的应用场景,完成基础设计。学习到了抽象类包含抽象方法和非抽象方法,子类必须实现抽象方法;而接口全为抽象方法,通过implements实现,适合定义 “行为契约”(如Flyable接口)。了解到抽象类适合 “is-a” 关系,且包含部分通用实现;接口适合 “can-do” 关系,定义行为规范(如Serializable)。抽象类体现 “模板设计”,接口体现 “行为规范”;接口支持多实现,弥补了 Java 单继承的限制。但是自身对接口默认方法的实际应用场景(如接口升级时不破坏现有实现类)理解不深。

5.集合框架:

熟悉常用接口和实现类,能完成基础数据操作。学习到了List:有序可重复,如ArrayList(数组实现,随机访问快)、LinkedList(链表实现,增删快)。但是对于HashMap、ConcurrentHashMap、HashSet、TreeSet等类的理解不深,在代码中还不能熟练使用,无法优化复杂数据操作性能。

6.异常处理:

能使用try-catch-finally处理常见异常,自定义简单异常。学会了区分 Checked 异常(如IOException,必须显式处理)和 Unchecked 异常(如NullPointerException,运行时异常)。在文件读取代码中用catch (Exception e) { }忽略所有异常,导致文件不存在时程序无任何提示,调试时难以定位问题。所以我学习到捕获异常应具体到最小粒度(如FileNotFoundException),并至少打印日志(e.printStackTrace())或抛出更高层异常。但是更多有关异常处理的内容基本没有再涉及,并且不太能在作业和代码中熟练使用。

7.JavaFX:

知道了JavaFX是Java官方GUI框架,相比Swing更现代化,支持FXML布局和CSS样式,但生态不如 Web 前端丰富。学习到优先使用布局容器(BorderPane、AnchorPane),通过约束条件(如锚定到窗口边缘)实现响应式布局。以及在控制器类中直接编写大量事件处理代码(如按钮点击后更新多个控件),导致代码可读性差,所以需要采用 MVC 模式分离逻辑:Model:数据模型(如Person类);View:FXML 布局文件;Controller:处理事件逻辑,调用 Model 更新数据。但自身仅了解基础控件和布局,复杂功能实现能力不足而且不熟悉动画效果(Timeline、Transition)、FXML 与 Java 代码的绑定机制,无法开发交互复杂的界面。

三、踩坑心得

  1. 在多态场景下,向下转型前必须用instanceof校验类型。例如:

java
Shape shape = new Circle();
if (shape instanceof Triangle) { // 实际是Circle,条件为false
Triangle triangle = (Triangle) shape; // 不会执行到这里
}

若省略instanceof校验,直接强制转型会抛出ClassCastException,这种错误在运行时才能发现,调试成本很高。建议在代码中养成 "先判断再转型" 的习惯。
2. 用catch (Exception e) { }忽略异常,程序出错时没有任何提示,调试时只能通过猜测定位问题。正确的做法是:捕获具体异常(如FileNotFoundException、IOException)。至少打印异常堆栈(e.printStackTrace())或记录日志。在可视化界面中,向用户显示错误提示(如 "文件读取失败")。
3. 很多时候知道了不一定等于掌握了,在学完一个知识点后应该要去多加练习,不然等到在PTA作业或者实验中需要使用时又要复习一遍,有些浪费时间。
4.动手写代码之前一定要先设计好各个类的职能以及给后面添加新的功能留出空间。很多迭代的题目都因为类的作用有些重复导致必须要对已有的代码进行更改,十分浪费时间,而且还可能出现一些意料之外的错误。这印证了 "单一职责原则" 的重要性 —— 每个类只负责一项核心功能。
5.要学会使用IDEA中的断点来测试代码,避免 “println 调试法”。
6.每次修改后运行测试用例,避免 “累积 100 行代码后一起调试” 的崩溃场景。而且在复杂的代码处添加必要注释,不然等到需要修改时很容易“无从下笔”。

四、改进建议及总结

  1. 课程方面:课程的内容有些跳脱,有些时候不知道老师到底是要讲解哪些地方的内容。比如老师讲解的设计模式,在我们平常写代码时似乎用不上,希望能够多一些这方面的讲解和事例展示。
  2. 作业方面:希望有些难度较大的题目老师能够在作业之后讲解一些,或者把部分源代码展示一下,不然有些题目可能到最后会直接放弃。
    3.实验方面:希望老师能够将实验计划书中的内容更加完善,有时候计划书中只提要求不提作用,导致我们实现相应代码后却不知道在哪里使用。
  3. 课上方面:希望老师在讲解一些内容时最好结合实例讲解,而且最好是我们写过的实例,拿我们没有写过或者了解过的实例进行展示很多时候还是似懂非懂。
    5.课下组织方面:希望老师开通一个学生之间自由讨论的平台,很多时候遇到困难听同学的讲解能让我们的印象更加深刻,而且对讲解的同学来说也是一个对自身知识掌握多少的检验。
posted @ 2025-06-21 02:20  写不来MATH  阅读(24)  评论(0)    收藏  举报