1. 前言
本门Java面向对象编程课程是我在计算机科学学习道路上的重要里程碑。通过一学期的系统学习,我全面掌握了Java语言特性与面向对象编程思想。课程采用多元化的教学方式,包括PTA编程作业、实验课实践、线上视频学习以及线下课堂讲解,形成了理论与实践相结合的完整学习闭环。
1.1 课程工作量分析
PTA作业共完成了12次题目集,平均每周1次,题目数量从最初的3-5题逐渐增加到后期的综合性大作业。特别值得一提的是"航空货运管理系统"这类综合性项目,需要投入10-15小时完成。
实验课程工作量不算太多,每次实验平均耗时3-4小时,内容涵盖从基础语法到GUI开发的完整知识体系。最耗时的实验是JavaFX图形界面开发,花费了近6小时完成。
线上学习方面,课程简洁明了,我完成了全部视频学习。
1.2 难度评估
课程难度呈现阶梯式上升趋势:
前4周:基础语法和简单面向对象概念(难度★★☆)
5-8周:继承、多态、接口等高级特性(难度★★★)
9-12周:集合框架、异常处理和IO流(难度★★★★)
13-16周:JavaFX图形界面开发(难度★★★★★)
最具挑战性的是JavaFX部分,需要同时理解事件驱动模型、FXML布局和MVC架构,综合性很强。
2. 面向对象技术总结
2.1 封装(Encapsulation)
学习成果:
掌握了通过private修饰符隐藏实现细节
熟练使用getter/setter方法控制属性访问
理解了封装对代码维护性的重要性
典型案例:
public class BankAccount {
private double balance;
public void deposit(double amount) {
if(amount > 0) {
balance += amount;
}
}
public double getBalance() {
return balance;
}
}
认知提升:封装不仅是数据隐藏,更是契约设计。良好的封装可以降低模块间的耦合度,我在PTA作业中通过合理封装使类的修改影响范围最小化。
欠缺之处:对包级私有(package-private)访问控制的使用场景理解不够深入。
2.2 继承(Inheritance)
学习成果:
能够正确使用extends关键字建立继承关系
理解方法重写(Override)与super关键字
掌握了继承的"is-a"关系判断原则
实验案例:
class Animal {
void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}
认知误区:初期曾滥用继承,试图用继承解决所有代码复用问题。通过"航空货运管理系统"的设计,我理解了组合优于继承的原则。
待提高:对继承层次过深导致的脆弱基类问题的解决方案掌握不够。
2.3 多态(Polymorphism)
学习成果:
理解编译时多态(重载)与运行时多态(重写)的区别
掌握通过接口实现多态的技术
能在实际项目中应用策略模式等基于多态的设计模式
认知提升:多态是面向对象最强大的特性之一,它使得程序扩展性大幅提升。在货运系统题目中,通过多态支持了不同货物类型的运费计算。
问题发现:对动态绑定机制在JVM中的实现原理理解不够深入。
2.4 抽象类与接口
学习成果:
能正确选择使用抽象类或接口
理解接口的默认方法和静态方法
掌握函数式接口与Lambda表达式的结合使用
实验代码:
abstract class Shape {
abstract double area();
}
interface Drawable {
default void draw() {
System.out.println("Drawing...");
}
}
class Circle extends Shape implements Drawable {
double area() { /* 实现 */ }
}
掌握不足:对接口演化(从Java 8到Java 17的接口特性变化)理解不够系统。
2.5 集合框架
学习成果:
掌握ArrayList、LinkedList、HashSet、HashMap等常用集合
理解迭代器模式和增强for循环
能正确选择集合类型解决实际问题
应用实例:
Map<String, List
// 使用Java 8 Stream API处理集合
double total = orders.stream()
.filter(o -> o.getAmount() > 100)
.mapToDouble(Order::getAmount)
.sum();
存在问题:对并发集合(如ConcurrentHashMap)的使用经验不足。
2.6 异常处理
学习成果:
理解checked exception与unchecked exception的区别
掌握try-catch-finally的正确使用
能自定义异常类表达业务异常
最佳实践:
try {
loadConfig("config.properties");
} catch (FileNotFoundException e) {
logger.error("配置文件缺失", e);
throw new BusinessException("系统配置错误", e);
} finally {
releaseResources();
}
认知误区:初期常常捕获异常后不做任何处理,通过代码审查意识到这会掩盖问题。
待改进:对异常处理性能开销的理解不够深入。
2.7 JavaFX
学习成果:
掌握FXML与Controller的绑定
理解事件驱动编程模型
能实现简单的MVC架构应用
实验案例:
// Controller类
public class LoginController {
@FXML
private TextField usernameField;
@FXML
protected void handleSubmit(ActionEvent event) {
String user = usernameField.getText();
// 处理逻辑
}
}
学习难点:线程安全问题(Platform.runLater的使用)和数据绑定机制花费了较多时间理解。
掌握不足:对CSS样式定制和动画效果的实现还不够熟练。
3. 采坑心得
3.1 设计模式应用误区
问题描述:在"航空货运管理系统"初期版本中,我试图为每个货物类型创建子类(普通货物、危险货物等),导致类爆炸。
错误代码:
class NormalCargo extends Cargo {}
class DangerousCargo extends Cargo {}
class ExpeditedCargo extends Cargo {}
// ...更多子类
解决方案:改用策略模式,将运费计算算法抽象为接口。
改进后:
interface RateStrategy {
double calculate(double weight);
}
class Cargo {
private RateStrategy strategy;
// ...
}
3.2 集合使用不当
问题场景:在题目中,使用ArrayList频繁删除中间元素导致性能问题。
错误代码:
List
// ...多次调用
list.remove(index); // O(n)操作
经验教训:理解不同集合的实现原理,根据操作特征选择合适集合。
3.3 异常处理不当
问题案例:在文件处理实验中,吞掉异常导致问题难以排查。
错误示范:
java
try {
loadFile();
} catch (IOException e) {
// 空catch块!
}
改进方案:
至少记录日志
使用有意义的自定义异常
考虑异常转译
改进后:
try {
loadFile();
} catch (IOException e) {
logger.error("文件加载失败: " + filePath, e);
throw new DataLoadException("无法加载数据文件", e);
}
4. 改进建议与课程总结
4.1 课程改进建议
教学方面:
增加代码审查环节,让学生互相评审代码
提供更多真实项目案例,如小型电商系统
加强调试技巧的专项训练
引入单元测试的早期教学
增加设计模式的专题讨论
学习建议:
建立个人代码库收集优秀实现
定期进行重构练习
参与开源项目积累实战经验
使用SonarQube等工具进行代码质量分析
养成编写技术博客的习惯
4.2 个人学习总结
通过本门课程的学习,我在以下几个方面获得了显著提升:
技术能力方面:
掌握了Java面向对象的核心特性,能够设计合理的类层次结构,理解了设计原则在实际项目中的应用场景,具备了使用JavaFX开发简单图形界面的能力,学会了集合框架的高效使用和异常处理的最佳实践。
工程思维方面:
认识到代码可读性的重要性,养成了良好的命名习惯,理解了模块化设计的价值,学会控制类的职责范围,建立了防御性编程的思维,对输入校验和异常处理更加重视,体会到测试驱动开发的优势,开始尝试先写测试再写实现。
仍需加强的领域:
并发编程:线程安全、锁机制等
JVM原理:内存模型、垃圾回收机制
设计模式:更多模式的深入理解和应用
性能优化:算法复杂度分析和调优技巧
4.3 未来学习规划
基于课程学习中的不足,我制定了以下学习计划:
深入Java核心技术:
阅读《Effective Java》和《Java并发编程实战》,研究JDK源码,理解核心类的实现。
扩展技术栈:
学习Spring框架的企业级应用开发,探索Java函数式编程特性,研究Java模块化系统(JPMS)。
工程实践:
参与GitHub上的开源Java项目,使用Jenkins搭建持续集成环境,学习使用JProfiler进行性能分析。
理论提升:
研究面向对象设计原则的数学基础,学习软件架构设计模式,了解领域驱动设计(DDD)思想。
这门Java面向对象编程课程为我打下了坚实的编程基础,使我对软件开发的认知从"能运行"提升到了"好设计"的层次。我将继续保持学习热情,在实践中不断提升自己的面向对象设计和实现能力。
浙公网安备 33010602011771号