第三次Blog Java课程总结

前言

不知不觉间,这一个学期的面向对象程序设计课程以及进入尾声。该说不愧是专业课吗,跟其他课程比较起来,java课是学习渠道以及任务类型最为全面、最为丰富的一门课程。课程主要是线下课程以及学堂在线线上课程,任务则主要是pta大作业、blog以及实验。以下对这五个部分进行简单的总结。

线上课程

学堂在线的线上课程相较而言是比较轻松的,但是也不能忽视。平时在线下课程之前不认真在学堂在线进行学习的话,上课的时候完全就是听天书了。线下课程像是教你怎么用枪,而线上课程就是给你填充弹药的。重要的是它足足占了课程成绩的30%啊!!!

线下课程

说实话,java的线下课与c语言的线下课完全不一样,学期刚开始的时候多少有点不适应。但是经过一段时间的磨合,我逐渐适应了这种实践为主的课堂。这一点尤其要感谢蔡轲老师,他在课堂上起到的引领作用帮我减轻了很多思维模式切换带来的不习惯。课堂上传授的知识的量也是比较合理,不会一次性输出太多新的知识,并且会经过一定量的实际,所以吸收起来也是不很困难。

PTA

这个学期总共完成了11次PTA作业,其中前四次是上学期在C语言课程中完成过的作业,要用java语言完成,毕竟是入门先热身的任务,而且也完成过一次了,所以难度不高;后面完成了两次大作业:其一——电梯调度程序,我只能说是阴的没边了,一方面是第一次进行这样的大作业,如何切入尚不清晰,其次题目测试点只有一个,出现问题要反复排查,改完一个还有一个等着你,没完没了;其二——航空货运系统,这个比电梯就人性化的多了,题目要求清晰,测试点完备,而且有了第一次的经验,应对起来也比较从容。总而言之,经过一学期的PTA洗礼,我的面向对象思维以及编程能力得到了大大磨练,以及不是当初的小白了。

Blog

Blog主要是一个总结复盘的任务,量不大、也没啥难度,不过效果还是很明显的,经过一个阶段的学习以及实践后,总结复盘是必不可少的,踩过的坑、收获到的经验,在系统地整理一遍后,印象会更加深刻。而且这样的Blog作业对我来说也是十分新颖,也是人生中的第一次尝试。

实验

额......实验的话,我想应该是争议最大的一个部分。实验内容本身题量和难度都适中,但是那个令人诟病的实验提交系统,也是令我十分无语-_-。第二次实验的时候还能凭借先人的智慧免除一个一个字符输入的苦难,但是魔高一尺,道高一丈,课程组老师对实验提交系统进行了n次迭代,每次都给我带来新的惊喜。当某次我关闭实验提交系统,发现我的复制粘贴直接被禁用了,真的给气笑了Anyway,希望下个学期实验提交系统可以人性化一点。

面向对象技术总结

通过本门课程的学习,我对面向对象编程的核心概念有了更深入的理解,特别是在以下技术点的实践应用中获得了显著提升:

1. 封装(Encapsulation)

在电梯模拟作业中,通过elv类封装电梯状态(当前楼层、运行方向)和行为(请求处理逻辑),所有属性设为private并通过公共方法访问。物流系统中更将封装发挥到极致:

  • Customer类封装客户基础属性和折扣率计算
  • Cargo类封装货物物理属性和计费规则
  • Order类整合所有业务实体并封装费用计算
// 典型封装示例:货物计费规则封装
public double getChargeableWeight() {
    return Math.max(actualWeight, (width * length * height) / 6000);
}

掌握程度:能熟练运用封装隐藏实现细节,但初期常犯将属性误设为public的错误。

2. 继承与多态(Inheritance & Polymorphism)

物流系统充分展现继承优势:

  • 客户类型:CustomerIndividualCustomer/CorporateCustomer
  • 货物类型:CargoNormalCargo/ExpediteCargo/DangerousCargo
// 多态典型应用:统一调用不同货物的费率计算
public double getRate() {
    // 各子类实现不同计费规则
}

认知突破:理解到继承不只是代码复用,更是对"is-a"关系的建模。多态使系统扩展性显著提升,新增货物类型只需继承基类。

3. 抽象类与接口(Abstract Class & Interface)

物流系统中抽象类的应用亮点:

  • CustomerCargo定义为抽象类
  • 强制子类实现关键抽象方法(getDiscountRate(), getRate()
// 抽象类定义契约
public abstract class Cargo {
    public abstract double getRate();
}

欠缺部分:未充分使用接口实现多继承能力,如可定义Weighable接口统一计量规范。

4. 集合框架(Collections)

在两次作业中广泛应用:

  • 电梯请求管理:ArrayList<extreq>存储外部请求
  • 物流订单:List<Cargo>管理货物集合
// 集合的典型操作
extreqs.subList(0, idx).clear(); // 批量移除元素
for(Cargo cargo : cargos) { ... } // 增强for循环遍历

掌握短板:对HashMap等键值集合使用较少,复杂数据查询效率待提升。

5. 异常处理(Exception Handling)

作业中暴露的不足:

  • 输入解析未处理NumberFormatException
  • 航班超载仅简单提示,无恢复机制
// 需要加强的异常处理
try {
    floor = Integer.parseInt(input);
} catch(NumberFormatException e) {
    System.err.println("楼层格式错误");
}

改进方向:需建立自定义异常体系(如OverloadException),完善异常传播机制。

6. JavaFX应用

虽未在作业中体现,但实验课掌握:

  • 掌握Stage/Scene基础架构
  • 能实现Button/ActionEvent基础交互
  • 使用TableView展示订单数据
    实践不足:事件绑定和CSS样式定制需加强,动画效果未实践。

采坑心得

1. 设计阶段之坑

问题:电梯作业初始版本忽略方向判定逻辑,导致"电梯震荡"现象(在相邻楼层来回移动)
解决:增加detdir()方向决策方法,引入目标楼层概念:

private void detdir() {
    int tgtfloor = getTargetFloor();
    if(tgtfloor < curfloor) curdir = dir.DOWN;
    else if(tgtfloor > curfloor) curdir = dir.UP;
}

教训:复杂逻辑应先画状态转移图再编码

2. 继承体系之痛

问题:物流系统初期将客户折扣率硬编码在Order类
错误示例

// 反面教材:违背开闭原则
if(customerType.equals("Corporate")) 
    discount = 0.8;

改进:通过继承体系实现策略模式

// 正确做法:多态分发
public double getTotalPayment() {
    return basePrice * customer.getDiscountRate();
}

心得:当出现大量if/else类型判断时,应考虑使用多态替代

3. 集合操作陷阱

问题:电梯作业中遍历时修改集合导致ConcurrentModificationException
错误代码

for(extreq req : extreqs) {
    if(req.getfloor() == curfloor) 
        extreqs.remove(req); // 运行时异常!
}

解决方案:改用迭代器或创建临时集合

Iterator<extreq> it = extreqs.iterator();
while(it.hasNext()) {
    if(it.next().getfloor() == curfloor) 
        it.remove();
}

经验:修改集合时必须使用迭代器的remove方法

4. 浮点数精度危机

问题:物流计费结果出现35.0000000001等异常值
错误代码

double fee = weight * rate; // 可能产生精度误差

解决方案

// 方案1:使用BigDecimal
new BigDecimal(weight).multiply(new BigDecimal(rate))

// 方案2:格式化输出
System.out.printf("%.1f", fee);

总结:金融计算必须使用BigDecimal,显示控制用格式化输出

5. 输入处理盲区

问题:物流系统未处理货物数量为0的边界情况
风险代码

int cargoCount = scanner.nextInt(); // 输入0导致空集合
getTotalPayment(); // 可能返回NaN

加固方案

if(cargos.isEmpty()) {
    throw new EmptyOrderException("订单不能无货物");
}

教训:所有用户输入都应视为"敌意输入"进行校验

6. 对象协作误区

问题:Order类最初承担太多职责,包含运费计算+显示逻辑
反模式

class Order {
    public void printInvoice() {...} // 违反单一职责
}

重构:拆分出OrderCalculatorOrderPrinter
心得:通过"一个类/方法只做一件事"原则保持代码纯洁性


总结提升

经过这些实践教训,我总结出面向对象开发的黄金法则

  1. 五秒规则:如果无法用5秒说明类的职责,就需要拆分
  2. 无感封装:修改类内部实现时,外部调用者不应受影响
  3. 多态优先:当出现switch(type)时,考虑用多态替代
  4. 防御性编程:所有public方法都应验证参数有效性
  5. 集合安全:遍历修改必须用迭代器(Iterator

这些经验将指导我未来的Java开发实践,尤其是在构建复杂业务系统时保持代码的可维护性和扩展性。

改进建议及总结

课程综合性总结

通过本学期的Java课程学习,我在面向对象编程、Java核心技术应用和项目实践等方面都取得了显著进步。课程采用"理论+实践+复盘"的教学模式,通过线上课程夯实基础,线下课堂强化应用,PTA作业锻炼编程能力,Blog总结促进知识内化,实验环节检验综合运用能力。这种多维度的学习体系使我对封装、继承、多态等核心概念有了深刻理解,也提升了解决实际问题的能力。

改进建议

  1. 教学内容优化

    • 复杂概念(如多线程、设计模式)增加实际案例解析
    • 易混淆知识点(抽象类vs接口)提供对比示例代码
    • 关键算法演示采用分步骤可视化展示
  2. 作业实验改进

    • PTA作业增设开放式题目(如自主设计物流系统扩展功能)
    • 提供代码优化建议而不仅是错误提示
    • 实验系统开放复制粘贴功能并增加异常保护机制
  3. 教学组织增强

    • 课堂增加实时编程演示和小组重构竞赛
    • 建立课程知识库整合往届优秀解决方案
    • 定期组织"代码诊所"解答共性难题

结语

本课程成功引导我完成了从面向过程到面向对象的思维转型,特别是在电梯调度和航空货运系统等项目中,真正体会到封装、继承、多态在实际开发中的价值。虽然过程中遇到过测试点调试、系统设计等挑战,但正是这些实践让我成长为更成熟的开发者。特别感谢蔡轲老师循序渐进的指导方式,让复杂概念的吸收变得自然顺畅。期待课程持续优化,为后续学子提供更优质的学习体验。

posted @ 2025-06-22 23:34  OnlyBlueeeeee  阅读(25)  评论(0)    收藏  举报