第三次blog作业

目录

一、前言

二、面向对象技术总结

三、踩坑心得

四、改进建议及总结

 

一、前言

通过本学期的Java面向对象程序设计课程,我系统性地完成了Blog作业、PTA题目集、实验项目以及线上线下课程的学习。在PTA作业方面,从基础的类与对象设计到复杂的图形界面开发,难度呈阶梯式上升。5次实验项目涵盖封装、继承、多态等核心概念,特别是实验4的抽象类与接口应用以及实验5的JavaFX图形界面开发,完成实验所需时间较长完成,让我深刻体会到理论到实践的转化过程。线上课程提供了灵活的学习方式,30余小时的教学视频与配套练习夯实了基础;线下课程的代码评审和各个设计模式则极大地提升了我的设计思维和问题解决能力。整体而言,课程体系完整,理论与实践紧密结合,虽然后期涉及GUI和复杂系统设计时挑战较大,但通过逐步攻克这些难点,我的面向对象编程能力和工程实践能力得到了显著提升。

二、 面向对象技术总结:

1. 封装技术

实践代码:

// PTA图形卡片题目
public class Circle {
    private double radius;
    
    public double getArea() {
        return Math.PI * radius * radius;
    }
}

掌握程度:能正确使用访问控制符,理解封装对数据保护的重要性

2. 继承与多态

实验代码:

// 实验3动物系统
Animal animal = new Lion();
animal.say(); // 输出"怒吼一声"

认知提升:理解运行时多态和里氏替换原则

3. 集合框架

PTA代码:

// 关键字统计
Map<String, Integer> wordCount = new HashMap<>();
wordCount.merge(word, 1, Integer::sum);

技术要点:掌握ArrayList/HashMap基础用法,但ConcurrentHashMap使用经验不足

4. JavaFX

①核心技术掌握

基础组件应用(实验5代码片段):

// 按钮事件处理
Button btn = new Button("提交");
btn.setOnAction(event -> {
    try {
        handleSubmit();
    } catch (InvalidInputException e) {
        showAlert(Alert.AlertType.ERROR, "输入错误", e.getMessage());
    }
});

// 文本输入验证
TextField nameField = new TextField();
nameField.textProperty().addListener((obs, oldVal, newVal) -> {
    if (!newVal.matches("[a-zA-Z]+")) {
        nameField.setStyle("-fx-border-color: red;");
    } else {
        nameField.setStyle("");
    }
});

布局管理实践:

BorderPane root = new BorderPane();
HBox topMenu = new HBox(10); // 间距10px
VBox leftPanel = new VBox(15); // 间距15px

// 实验5动物管理系统布局
root.setTop(buildToolBar());
root.setLeft(buildAnimalList());
root.setCenter(buildDetailView());

②事件处理机制

典型事件绑定:

// 方法引用方式
btn.setOnAction(this::handleButtonClick);

// Lambda表达式方式
circle.setOnMouseClicked(e -> {
    if (e.getButton() == MouseButton.PRIMARY) {
        selectAnimal(e.getSource());
    }
});

// 键盘事件
scene.setOnKeyPressed(e -> {
    if (e.getCode() == KeyCode.ENTER) {
        confirmSelection();
    }
});

③数据绑定与属性

属性绑定示例:

// 实验5的状态绑定
Label statusLabel = new Label();
statusLabel.textProperty().bind(
    Bindings.concat("当前选择:")
           .concat(selectedAnimal.nameProperty())
);

// 双向绑定
Slider volumeSlider = new Slider();
TextField volumeText = new TextField();
volumeText.textProperty().bindBidirectional(
    volumeSlider.valueProperty(), 
    new NumberStringConverter()
);
 

④动画与视觉效果

基础动画实现:

// 动物移动动画(实验5)
TranslateTransition moveAnim = new TranslateTransition(Duration.seconds(1.5), animalImage);
moveAnim.setToX(targetX);
moveAnim.setToY(targetY);
moveAnim.setInterpolator(Interpolator.EASE_BOTH);

ParallelTransition comboAnim = new ParallelTransition(
    moveAnim,
    new FillTransition(Duration.seconds(1), animalImage, Color.WHITE, Color.LIGHTGREEN)
);

comboAnim.setOnFinished(e -> updateStatus());
不足:
  1. 复杂集合操作:如PTA中分组统计时对Stream API不够熟练

  2. GUI架构设计:航空货运管理系统设计欠缺

  3. 异常恢复机制:目前多采用快速失败,需学习更优雅的错误恢复策略

  4. FXML布局和CSS样式应用不熟练

5. 异常处理

实验深化应用:

// 实验3文件读取
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
    String line;
    while((line = br.readLine()) != null) {
        // 处理数据
    }
} catch (IOException e) {
    System.err.println("文件读取失败: " + e.getMessage());
    throw new DataLoadException("加载动物数据失败", e); // 自定义异常
}

不足与改进:

  1. 需要加强异常恢复策略(如实验5网络中断后的重试机制)

  2. 学习Spring的全局异常处理模式

  3. 完善异常日志记录

通过PTA和实验的交替训练,我建立起"设计-实现-重构"的完整开发思维链。特别是在完成实验5后回看PTA的谷仓题目,明显感受到对类职责划分能力的提升。后续需要重点突破复杂系统设计能力,并学习如何在团队协作中应用这些面向对象技术。

三、 采坑心得

1. Collections.sort()的契约要求

在实现PTA图形卡片排序功能时,发现必须遵守以下规范:

public class Card implements Comparable<Card> {
    private final Shape shape;
    
    @Override
    public int compareTo(Card other) {
        return Double.compare(this.shape.getArea(), other.shape.getArea());
    }
}
 

关键认知:

实现Comparable接口是使用Collections.sort()的必要前提!!!

 

2. 继承体系中super()的约束

实验3构建动物继承体系时验证的规范:

public class Lion extends Animal {
    public Lion(String name, double weight) {
        super(name, weight); // 必须作为第一条语句
        this.attackPower = 1; // 后续进行子类特有初始化
    }
}

技术要点:

1. super()调用必须出现在子类构造方法的第一行

2. 若父类没有无参构造器,必须显式调用有参构造器

3. 初始化顺序:父类字段 → 父类构造器 → 子类字段 → 子类构造器

 

3. 文件编码问题的系统化解决方案

在GUI实验项目中处理文本文件时,发现必须明确指定编码:

// 错误做法:依赖平台默认编码
BufferedReader reader = new BufferedReader(new FileReader("data.txt"));
 
// 正确实现:显式指定UTF-8编码
BufferedReader reader = Files.newBufferedReader(
    Paths.get("data.txt"), 
    StandardCharsets.UTF_8
); 
最佳实践:

1. 统一使用UTF-8编码处理文本

2. 对于用户提供的文件,应增加编码检测机制

3. 重要场景使用字符编码验证:

try (InputStreamReader isr = new InputStreamReader(
    new FileInputStream(file), "UTF-8")) {
    // 文件内容处理
} catch (UnsupportedCharsetException e) {
    // 处理编码不支持的情况
}

 

4. 经验总结

1. 集合排序

●  推荐使用Comparator.comparing()等链式比较器

●  对于复杂对象,考虑实现多级比较

 

2. 继承构造

●  建议父类提供无参构造器以降低复杂度

●  使用Builder模式解决复杂初始化场景

 

3. 文件处理

●  始终显式指定字符编码

●  使用NIO.2 API(Files类)提供更健壮的文件操作

●  考虑使用Apache Commons IO等工具库简化编码处理

 

这些技术规范的理解和掌握,显著提升了代码的健壮性和可维护性,也是面向对象编程中必须遵循的基本准则。

四、改进建议及总结

课程综合性总结

通过本学期的系统学习,我建立了完整的面向对象编程知识体系,从基础的封装继承到复杂的GUI开发,形成了"设计优先,代码落地"的编程思维。课程设置的层次性明显,PTA作业与实验项目形成有效互补,线上资源与线下指导相结合的教学模式使学习更加立体化。最大的收获是培养了面向对象的设计能力,能够将现实问题抽象为类与对象,并通过合理的架构设计实现功能需求。

 

具体改进建议

 1. 教学组织方面

●  建议在实验课中增加"设计评审"环节,让学生在编码前展示类图设计,教师可即时指导架构合理性

●  线上课程可增加"常见错误案例库",分类展示典型编程错误及调试方法

 

2. 实验设计方面

●  实验指导书可增加"扩展思考"板块,引导学有余力的学生探索进阶实现

●  提供实验项目的"阶梯式"完成标准(基础要求/进阶要求/挑战要求)

 

3. 作业反馈方面

●  建立错误代码案例的匿名分享机制,促进共同学习

 

总结

通过本课程的学习,我不仅掌握了Java语言的语法特性,更重要的是培养了面向对象的设计思维。从最初的简单类设计,到后来的复杂系统构建,我逐步理解了封装、继承、多态等核心概念的实际价值。特别是在完成动物电器模拟系统时,当看到自己设计的类结构能够灵活扩展新功能,真正体会到了良好设计带来的便利。

最大的收获是学会了"分而治之"的解决问题方法:将复杂系统分解为相互协作的对象,每个对象专注于自己的职责。这种思维方式不仅适用于编程,也能应用于其他领域的问题解决。

未来,我将继续深入学习设计模式和架构知识,并尝试将所学应用于实际项目中。同时,也会加强在集合框架和多线程编程方面的练习,弥补当前的技术短板。

最后,感谢老师的悉心指导和同学们的热情帮助,这段学习经历将成为我技术成长道路上的重要里程碑。

posted @ 2025-06-22 12:13  冀宇橦  阅读(22)  评论(0)    收藏  举报