面向对象程序设计课程总结
1. 前言
作为一名大一软件工程专业的学生,回顾这学期的面向对象程序设计课程,真是一段充满挑战的编程之旅。课程通过PTA作业、实验任务和线上/线下教学相结合的方式,让我系统学习了Java面向对象编程的核心技术。
对我来说,课程难度相当大,特别是从C语言过渡到面向对象思维的过程:
Blog作业:3次阶段性总结,帮助我系统梳理PTA作业中的设计思路和技术要点,如航空货运系统的策略模式实现
PTA作业:11次题目集形成渐进式学习路径,从基础类设计到复杂系统架构,如电梯调度系统迭代开发
实验任务:5次实验从环境配置到JavaFX应用,特别是"大象进冰箱"实验完整实践了MVC设计模式
线上课程:提供灵活预习资源,通过视频讲解和在线测试强化基础知识
线下课程:翻转课堂形式促进深度互动,老师通过电梯调度等案例精讲设计原则
各环节工作量分布合理,形成"理论→实践→反思"的完整学习闭环。课程内容紧密衔接,从封装基础到JavaFX综合应用,构建了系统的知识体系。
最大的收获不仅是Java语法,更是面向对象的思维方式——学会用对象视角解决问题。虽然过程艰难,但每次突破都带来巨大成就感。
2. 面向对象技术总结
2.1 封装:数据的"保险箱"
我的理解:就像把重要物品锁进柜子,封装是把数据保护在类内部。
// 电梯系统示例
public class Elevator {
private int currentFloor; // 当前楼层私有
// 通过方法安全修改状态
public void moveTo(int target) {
if(target >= minFloor && target <= maxFloor) {
currentFloor = target;
}
}
}
学习收获:
理解了private保护数据的重要性
学会使用getter/setter控制访问
在图形卡片作业中实践了封装设计
不足:
复杂系统中对访问权限把握不准
有时过度封装导致代码冗长
2.2 继承:代码的"传家宝"
我的理解:就像孩子继承父母特征,子类可以复用父类功能。
// 谷仓系统继承示例
学习收获:
掌握extends建立类层次
学会用super调用父类方法
理解"is-a"继承关系
踩坑经历:
曾尝试让CubeGranary继承两个父类(Java不支持)
过度继承导致类层次过深
2.3 多态:编程的"变形术"
我的理解:同个方法在不同对象有不同表现,就像同个按钮在不同设备功能不同。
// 图形卡片多态示例
List<Shape> shapes = new ArrayList<>();
shapes.add(new Circle(5.0));
shapes.add(new Rectangle(3.0, 4.0));
for (Shape shape : shapes) {
System.out.println("面积: " + shape.getArea()); // 不同子类不同计算
}
学习收获:
理解父类引用指向子类对象
在航空系统应用策略模式
学会用接口实现多态
困惑点:
多态调用时的执行顺序易混淆
Lambda表达式使用不够熟练
2.4 抽象类与接口:设计的"蓝图"
我的理解对比:
|
特性 |
抽象类 |
接口 |
|---|---|---|
|
定义方式 |
abstract class |
interface |
|
方法实现 |
可包含具体方法 |
JDK8+支持default方法 |
|
构造方法 |
有 |
无 |
|
多继承 |
不支持 |
可实现多个 |
// 航空系统接口应用
interface FreightCalculator {
double calculate(Goods goods);
}
class NormalCalculator implements FreightCalculator {
@Override
public double calculate(Goods goods) {
// 普通货物计算
}
}
学习难点:
抽象类和接口的选择常犹豫
多层继承时设计不够优雅
接口默认方法使用经验少
2.5 集合框架:数据的"收纳盒"
我的理解:就像不同类型的储物箱,集合是存放和操作数据的容器。
// 关键词统计示例
Map<String, Integer> wordCount = new HashMap<>();
String[] words = {"public", "class", "public"};
for (String word : words) {
wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);
}
常用工具:
ArrayList:最常用的动态数组
HashMap:键值对快速查找
Collections:排序、查找工具类
不足:
LinkedList使用场景把握不准
流式处理(Stream API)不熟练
多线程集合几乎没接触
2.6 异常处理:程序的"保险丝"
我的理解:就像电路保险丝防止设备损坏,异常处理保护程序免于崩溃。
try {
Fille file = new File("data.txt");
Scanner scanner = new Scanner(file);
} catch (FileNotFoundException e) {
System.out.println("文件找不到: " + e.getMessage());
} finally {
System.out.println("资源清理完成");
}
学习收获:
掌握try-catch-finally结构
理解异常类型体系
基础异常处理能力
不足:
自定义异常设计经验少
资源关闭常忘记
2.7 JavaFX:界面的"画笔"
我的学习经历:
第一次做出有按钮的窗口
学会用SceneBuilder设计界面
实现简单的计算器功能
最大挑战:
事件处理逻辑混乱
布局管理器运用不灵活
控件属性设置常出错
3. 踩坑心得
3.1 设计模式误用之痛
在航空货运系统初版中,我将所有计算逻辑塞进一个类:
class CargoCalculator {
// 错误示范:缺乏扩展性
public double calculate(Goods goods) {
if("危险品".equals(goods.getType())) {
// 危险品计算
} else if("加急".equals(goods.getType())) {
// 加急计算
} // 更多if-else...
}
}
问题:新增货物类型需要修改核心代码
解决:改用策略模式,每个货物类型独立计算器
教训:不要把所有鸡蛋放在一个篮子里
3.2 空指针异常噩梦
JavaFX开发中的典型错误:
public void initialize() {
btnCalculate.setOnAction(e -> calculate()); // 按钮未初始化
}
private void calculate() {
// 抛出NullPointerException
}
排查过程:
- 检查FXML文件中fx:id是否匹配
- 确认Controller正确关联
- 添加@FXML注解
- 最终发现按钮未初始化
教训:IDE的SceneBuilder插件能预防此类问题
3.3 集合选择不当的代价
在图形卡片排序中最初选择不当:
Vector<Shape> shapes = new Vector<>(); // 老式集合
Collections.sort(shapes); // 同步操作效率低
优化:改用ArrayList + 排序优化
List<Shape> shapes = new ArrayList<>();
shapes.sort(Comparator.comparingDouble(Shape::getArea));
3.4 继承滥用的后果
谷仓系统初版设计:
class Granary {}
class CubeGranary extends Granary {}
// 过度继承
class WoodenCubeGranary extends CubeGranary {}
重构:改用组合模式更灵活
class Granary {
private Material material;
private Shape shape;
}
4. 改进建议
4.1 课程内容优化
- JavaFX基础加强:
增加简单界面设计练习
提供常见控件使用示例
基础事件处理实战
- 设计模式入门:
// 工厂模式简单示例
class ShapeFactory {
public Shape create(String type) {
switch(type) {
case "circle": return new Circle();
case "rect": return new Rectangle();
default: throw new IllegalArgumentException();
}
}
}
- 集合框架实践:
ArrayList与LinkedList对比
HashMap原理浅析
使用Collections工具类
4.2 实验环节改进

具体建议:
实验指导书提供3种实现方案参考(基础/标准/优化)
设置实验中期检查点(完成度40%时)
实验后匿名展示优秀解决方案
提供实验报告模板(包含设计思路栏)
4.3 学习资源补充
图解面向对象:用生活案例解释概念
常见错误手册:NPE、并发修改等
JavaFX组件速查:常用控件属性方法
调试技巧指南:断点、变量监视等
4.4 评价机制优化
代码质量评分:
命名规范(20%)
注释质量(20%)
类设计(30%)
功能实现(30%)
增量式评分:
设计阶段(类图):20%
核心功能实现:50%
完整功能+异常处理:30%
同伴评审:
3人小组互评
提供标准化评审表
教师抽查评审质量
AI辅助检查:
使用GitHub Copilot检测代码重复率
用SonarQube分析代码质量
自动识别常见设计问题
4.5 对课程组织的建议:
课前:在线上平台发布概念动画(如封装保险箱比喻)
课中:采用"案例演示→小组讨论→代码实战"三段式教学
课后:组织跨年级项目组(如学长指导JavaFX项目)
5.总结
这门面向对象程序设计课程是我编程学习的重要转折点。从最初面对PTA作业的手足无措,到最后能独立设计Java应用,这段旅程充满挑战但收获巨大。本课程的最大价值在于培养了对象思维和设计能力:
学会用封装构建安全边界
通过继承建立知识体系
以多态应对需求变化
用抽象思维分解复杂问题
三个关键成长:
思维转变:从面向过程到面向对象的跨越
设计能力:学会用类图规划程序结构
调试耐心:通过无数Bug磨练出解决问题的能力
未来学习方向:
深入Spring Boot应用开发
学习Android应用开发
尝试参与开源Java项目
探索设计模式进阶应用
仍需加强的方面:
复杂类层次设计能力
设计模式的灵活应用
JavaFX深度开发技能
大型项目的架构规划
"面向对象不是语言的特性,而是解决问题的视角"
这门课让我明白,编程不仅是写代码,更是用抽象思维建模现实的艺术。课程虽结束,但面向对象的探索之旅才刚刚开始。带着封装的思想保护数据安全,用继承的眼光构建知识体系,以多态的灵活应对需求变化,这些思维模式将伴随我整个编程生涯
浙公网安备 33010602011771号