Zealshow

导航

 

面向对象程序设计课程总结

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 继承:代码的"传家宝"

我的理解:就像孩子继承父母特征,子类可以复用父类功能。

// 谷仓系统继承示例

abstract class Granary { // 父类
protected double height;
 
public Granary(double height) {
this.height = height;
}
 
public abstract double getVolume();
}
class CylinderGranary extends Granary { // 子类
private double radius;
 
public CylinderGranary(double radius, double height) {
super(height); // 调用父类构造
this.radius = radius;
}
 
@Override
public double getVolume() {
return Math.PI * radius * radius * height;
}
}

学习收获:

掌握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

}

排查过程

  1. 检查FXML文件中fx:id是否匹配
  2. 确认Controller正确关联
  3. 添加@FXML注解
  4. 最终发现按钮未初始化

教训: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 课程内容优化

  1. JavaFX基础加强

增加简单界面设计练习

提供常见控件使用示例

基础事件处理实战

  1. 设计模式入门

// 工厂模式简单示例

class ShapeFactory {

public Shape create(String type) {

switch(type) {

case "circle": return new Circle();

case "rect": return new Rectangle();

default: throw new IllegalArgumentException();

}

}

}

  1. 集合框架实践

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深度开发技能

大型项目的架构规划

"面向对象不是语言的特性,而是解决问题的视角"
这门课让我明白,编程不仅是写代码,更是用抽象思维建模现实的艺术。课程虽结束,但面向对象的探索之旅才刚刚开始。带着封装的思想保护数据安全,用继承的眼光构建知识体系,以多态的灵活应对需求变化,这些思维模式将伴随我整个编程生涯

posted on 2025-06-22 11:46  Zealshow  阅读(16)  评论(0)    收藏  举报