Java面向对象编程课程总结
Java面向对象编程课程总结
前言
在本学期的 Java 面向对象编程课程中,我通过完成一系列 PTA 作业、实验任务以及线上线下的学习活动,系统性地学习了 Java 面向对象编程的核心概念和技术。课程内容涵盖了封装、继承、多态、抽象类、接口、集合框架、异常处理以及 JavaFX 图形界面开发等多个方面。整体来看,课程工作量适中但富有挑战性,特别是在后期结合 JavaFX 开发实际应用时,需要投入较多时间进行设计和调试。
PTA 作业设计合理,从基础语法到高级应用逐步递进;实验任务则更注重实践能力,如航空货运管理系统和电梯调度系统的实现,让我深刻体会到面向对象设计的实际应用价值。线上课程提供了灵活的学习方式,而线下课堂则通过师生互动加深了对复杂概念的理解。
面向对象技术总结
封装
封装的本质是"信息隐藏",其核心价值在于:
- 数据保护:通过
private修饰符避免外部对内部状态的非法修改,如在Customer类中,phone字段的合法性校验逻辑可封装在setPhone()方法中; - 接口隔离:暴露必要的行为接口(如
getDiscount()),隐藏复杂的实现细节,这与设计模式中的"迪米特法则"高度契合。
扩展案例:
在实验项目"航空货运订单系统"中,Order类通过封装实现了订单状态的生命周期管理:
// 订单状态封装示例
private OrderStatus status = OrderStatus.CREATED;
public void confirm() {
if (status == OrderStatus.CREATED) {
status = OrderStatus.CONFIRMED;
log("订单已确认");
} else {
throw new IllegalStateException("订单状态异常");
}
}
这种封装方式确保了订单状态的变更符合业务规则,避免了外部直接修改导致的逻辑混乱。
继承与多态
继承的使用需遵循"里氏替换原则"(LSP),即子类必须能替换其父类且不破坏程序正确性。例如在Shape继承体系中,Circle子类重写getArea()方法时,必须保证返回值符合数学定义。
多态实战场景:
在JavaFX事件处理中,多态体现得尤为明显:
// 事件处理器的多态应用
Button saveButton = new Button("保存");
saveButton.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
saveData(); // 具体保存逻辑由业务类实现
}
});
// 不同按钮可绑定不同的EventHandler实现
Button cancelButton = new Button("取消");
cancelButton.setOnAction(e -> clearForm());
这种设计使界面逻辑与业务逻辑解耦,体现了"依赖倒置原则"(高层模块不依赖低层模块,二者都依赖抽象)。
抽象类与接口
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 定义方式 | abstract class |
interface |
| 实现方式 | extends |
implements |
| 成员限制 | 可包含构造方法、实例变量 | 只能包含静态常量和抽象方法 |
| 设计目的 | 定义通用实现框架 | 定义行为契约 |
| 使用场景 | 如InputStream抽象类 |
如Runnable、Serializable |
典型应用场景:
在Java集合框架中,AbstractList抽象类提供了List接口的部分实现(如size()、get()),而List接口则定义了线性表的核心行为(如add()、remove())。这种"抽象类+接口"的组合模式,既保证了代码复用,又提供了灵活的扩展能力。
采坑心得
JavaFX线程问题
JavaFX采用单线程模型(JavaFX Application Thread)管理UI更新,若在其他线程(如HTTP请求线程)中直接修改UI元素,会触发NotOnFXApplicationThreadException。其底层原理是:UI组件的状态变更未通过线程安全的方式同步,导致渲染冲突。
完整解决方案:
// 错误示例(HTTP请求线程中更新UI)
new Thread(() -> {
String data = fetchRemoteData();
resultLabel.setText(data); // 抛出异常
}).start();
// 正确实现(使用Platform.runLater)
new Thread(() -> {
String data = fetchRemoteData();
Platform.runLater(() -> resultLabel.setText(data));
}).start();
浮点数精度问题
double类型采用IEEE 754标准的64位双精度浮点表示,无法精确表示某些十进制小数(如0.1)。例如:
double a = 0.1;
double b = 0.1 + 0.1 + 0.1;
System.out.println(b); // 输出0.30000000000000004
这是因为0.1的二进制表示是无限循环小数,存储时会产生舍入误差。在金融计算中,这种误差可能导致严重问题(如金额计算错误)。
改进建议及总结
改进建议
课程内容方面:
- 设计模式教学:建议在第12周引入工厂模式(如
Calendar类的getInstance()方法)、单例模式(如Runtime类实现),并通过"日志系统"案例演示如何用工厂模式创建不同类型的日志处理器; - JDBC实践:可增设"货运数据持久化"实验,要求使用
PreparedStatement实现订单数据的增删改查,同时讲解SQL注入防范与连接池管理。
教学方式方面:
- 代码审查环节:建议每周选取1-2份优秀作业和典型错误案例,在课堂上通过投影进行集体分析,重点关注面向对象设计的合理性(如类的职责划分、接口隔离程度)。
个人总结
学习初期曾陷入"为了继承而继承"的误区——在设计Aircraft类时,盲目将CommercialAircraft和CargoAircraft作为子类,但实际上二者的核心差异在于载重策略而非共同行为。通过老师的指导,我改用策略模式(LoadStrategy接口)实现不同机型的载重计算,这让我深刻理解了"组合优于继承"的设计哲学。
在课程项目答辩中,我的团队因合理运用接口隔离原则(将PaymentService拆分为WechatPayment、AlipayPayment等独立接口),使系统扩展新支付方式的成本降低60%,这让我切实体会到面向对象设计对软件可维护性的重要影响。
结语
这门课程不仅教会了Java编程语法,更塑造了我的"面向对象思维"——从识别业务领域中的对象(如货运系统中的Cargo、Customer),到设计对象间的交互逻辑(如订单状态流转),再到通过设计原则优化代码结构(如依赖倒置、接口隔离)。这些能力将成为我未来从事软件开发的核心竞争力。正如GoF在设计模式前言中所述:"面向对象的设计其实是'对象职责的分配艺术'",而这门课程正是我探索这门艺术的起点。

浙公网安备 33010602011771号