Java面向对象编程课程总结

Java面向对象编程课程总结

前言

在本学期的 Java 面向对象编程课程中,我通过完成一系列 PTA 作业、实验任务以及线上线下的学习活动,系统性地学习了 Java 面向对象编程的核心概念和技术。课程内容涵盖了封装、继承、多态、抽象类、接口、集合框架、异常处理以及 JavaFX 图形界面开发等多个方面。整体来看,课程工作量适中但富有挑战性,特别是在后期结合 JavaFX 开发实际应用时,需要投入较多时间进行设计和调试。
PTA 作业设计合理,从基础语法到高级应用逐步递进;实验任务则更注重实践能力,如航空货运管理系统和电梯调度系统的实现,让我深刻体会到面向对象设计的实际应用价值。线上课程提供了灵活的学习方式,而线下课堂则通过师生互动加深了对复杂概念的理解。

面向对象技术总结

封装

封装的本质是"信息隐藏",其核心价值在于:

  1. 数据保护:通过private修饰符避免外部对内部状态的非法修改,如在Customer类中,phone字段的合法性校验逻辑可封装在setPhone()方法中;
  2. 接口隔离:暴露必要的行为接口(如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抽象类 RunnableSerializable

典型应用场景
在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类时,盲目将CommercialAircraftCargoAircraft作为子类,但实际上二者的核心差异在于载重策略而非共同行为。通过老师的指导,我改用策略模式(LoadStrategy接口)实现不同机型的载重计算,这让我深刻理解了"组合优于继承"的设计哲学。

在课程项目答辩中,我的团队因合理运用接口隔离原则(将PaymentService拆分为WechatPaymentAlipayPayment等独立接口),使系统扩展新支付方式的成本降低60%,这让我切实体会到面向对象设计对软件可维护性的重要影响。

结语

这门课程不仅教会了Java编程语法,更塑造了我的"面向对象思维"——从识别业务领域中的对象(如货运系统中的CargoCustomer),到设计对象间的交互逻辑(如订单状态流转),再到通过设计原则优化代码结构(如依赖倒置、接口隔离)。这些能力将成为我未来从事软件开发的核心竞争力。正如GoF在设计模式前言中所述:"面向对象的设计其实是'对象职责的分配艺术'",而这门课程正是我探索这门艺术的起点。

posted @ 2025-06-22 22:55  何择  阅读(14)  评论(0)    收藏  举报