一. 前言
本篇文章总结分析Java面向对象程序课程:
(1)线上课程与理论学习:
内容:通过视频课程学习Java面向对象核心概念(封装、继承、多态)及核心内容(抽象类、接口、泛型、集合、正则表达式等)。
★★☆☆☆工作量:每周需投入3-4小时,包括观看视频(约2小时)、完成随堂测验(选择题、简答题)。
(2)线下课程与实验实践:
内容:以案例驱动(主要以大象装进冰箱实例)的方式开展实验,以及迭代实验,如异常处理代码调试、类与对象的设计、多态性实现、用户界面设计等。
★★★★☆工作量:每周8-10小时,需完成实验报告(代码提交+实验分析);还需要手敲代码到实验提交系统里面(这个真的敲得巨巨巨难受,很吃操作的,约4小时),但是手敲代码对报错的印象是无比深刻的,大部分报错是单词敲错(实验提交系统没有编译报错);在我写实验五的用户界面设计时,发现报错是因为编译器版本不同,比如var和node的使用,实验提交系统里只支持node的使用,这个让我印象比较深刻。
(3)周期性作业与项目:
① PTA作业:
频率与内容:每周1次,涵盖基础语法(如集合ArrayList、LinkedList操作)、面向对象特性(如抽象类、接口实现)及算法设计(如电梯单部调度设计)。
★★★★☆工作量:单次作业耗时4-6小时,需通过调试与优化代码以满足测试用例要求。
② Blog作业:
要求:共撰写两篇技术博客(和这一次的总结性博客),内容需包含对阶段PTA作业的总结、代码示例及个人反思(如航空货运管理系统中的继承与多态的设计)。
★★★☆☆工作量:每篇约3000字,需投入6-8小时进行资料整理与写作。
(4)航空货运管理系统GUI设计:
目标:开发一个完整的航空货运管理用户界面设计系统,需整合多文件存储、用户下订单处理、支付处理、物流动画设计等知识点。
★★★★★★ 工作量:总耗时约30-40小时,涵盖需求分析、模块设计、代码实现、程序运行与测试优化等。
二. 面向对象技术总结
① 封装:
学什么: 通过实验理解封装的本质是将数据与操作绑定,通过访问修饰符(private/protected/public)控制访问权限,并利用getter/setter方法实现数据校验。
应用案例: 在实验中设计Elephant类时,将name、weight等属性设为private,并通过setName(int name)方法限制名字非负,避免非法数据输入。
掌握程度: 熟练掌握封装的语法与设计原则,但对封装在大型系统中的模块化作业理解较浅。
② 继承与多态:
学什么: 继承通过extends实现代码复用,多态通过父类引用指向子类对象(动态绑定)实现接口统一。
应用案例: 在PTA航空货运管理系统作业中设计Customer父类与IndividualCustomer、CorporateCustomer子类,通过discountRate()方法重写实现多态。
掌握程度: 能完成继承链设计与多态调用,但对多重继承(接口实现)与泛型继承(如List
③ 抽象类与接口:
学什么: 抽象类(abstract class)用于定义部分实现的方法,接口(interface)定义纯抽象行为。例如,在实验中定义抽象类Animal包含计算动物总重量的抽象方法getAllWeight(),子类Elephant继承后重写实现具体逻辑。
应用案例: 实验作业中通过接口Comparable实现对象排序,自定义类实现compareTo()方法。
掌握程度: 能区分抽象类与接口的使用场景。
④ 集合框架:
学什么: 掌握List、Set、Map接口及其实现类(如ArrayList、HashSet、HashMap)的特性与适用场景。
应用案例: PTA作业中用HashMap统计Java关键词频率,利用HashSet去重。
掌握程度: 能熟练使用常用集合类LIst,但对Set和Map不太熟悉。
⑤ 异常处理:
学什么: 通过try-catch-finally捕获异常,自定义异常类继承Exception或RuntimeException。例如,在文件读写实验中捕获IOException,并设计InvalidInputException处理非法输入。
应用案例: 翻转课堂用户界面设计作业中利用 try-catch代码块处理异常情况。
点击查看代码
// 设置下拉框选择事件处理
comboBoxCity.setOnAction(e -> {
String selected = comboBoxCity.getValue();// 显示默认选中项
System.out.println("用户选择了:" + selected);
// 创建窗口并显示
try {
District(selected, arg0);
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
});
⑥ JavaFX:
学什么: 使用JavaFX构建GUI应用,掌握Scene、Stage、Button等组件及事件处理。例如,在实验中设计登录界面,通过setOnAction响应按钮点击事件。
应用案例: 航空货运管理GUI设计中用TableView展示数据文件表格。
掌握程度: 能完成基础界面开发,但对动画效果(Timeline)模式等高级特性未深入探索。
三. 采坑心得
注: 阶段性PTA作业的采坑心得可前往我前两次分享的BLOG作业中查看,本次重点分享我的航空货运管理系统GUI作业(JavaFX)的采坑心得。
① 问题: 嵌套布局导致界面错乱:
场景: 初期使用多个HBox和VBox嵌套实现复杂表单,但窗口缩放时组件挤压变形,输入框与标签错位。
原因: 未合理利用GridPane的行列约束,过度依赖绝对定位。
解决方案: 改用GridPane划分区域,通过RowConstraints和ColumnConstraints设置固定比例与填充。
经验: 优先选择约束布局(如GridPane)处理复杂界面,减少嵌套层级。
★★★★☆ GridPane真的真的好用,强烈推荐哈。
点击查看GridPane布局代码
customerGrid.setVgap(10);
customerGrid.setHgap(15);
nameField = createTextField("客户姓名", "请输入客户姓名");
phoneField = createTextField("客户联系电话", "请输入联系电话");
emailField = createTextField("客户编号", "请输入客户的编号");
addressArea = createTextArea("收货地址", "请输入详细收货地址");
typeCombo = createComboBox("客户类型",
"Individual", "Corporate", "重要客户", "特殊客户");
typeCombo.setValue("Individual");
addressArea.setPrefRowCount(1);
customerGrid.add(createLabel("客户姓名:"), 0, 0);
customerGrid.add(nameField, 1, 0);
customerGrid.add(createLabel("客户联系电话:"), 2, 0);
customerGrid.add(phoneField, 3, 0);
customerGrid.add(createLabel("客户编号:"), 0, 1);
customerGrid.add(emailField, 1, 1);
customerGrid.add(createLabel("收货地址:"), 2, 1);
customerGrid.add(addressArea, 3, 1);
customerGrid.add(createLabel("客户类型:"), 0, 2);
customerGrid.add(typeCombo, 1, 2);
GridPane.setColumnSpan(addressArea, 3);
界面效果:
② 问题: 控件对齐与间距不一致:
场景: 不同模块的按钮、标签间距差异大,影响视觉一致性。
解决方案: 统一设置padding和spacing属性,例如全局定义Insets和HBox.setSpacing(10)。
使用CSS类(如.button-style)统一控件字体、边距。
经验: 通过CSS样式表集中管理界面风格,避免默认的编码样式。
③ 问题: 按钮点击无响应
场景: 部分按钮无法触发事件,但代码中已注册setOnAction。
原因: 事件处理代码抛出未捕获异常,导致后续逻辑中断。控件未正确添加到场景图(Scene)中。
解决方案: 在事件处理器中添加try-catch块,捕获NullPointerException等异常。使用System.out.println调试控件是否成功绑定到控制器。
经验: 事件处理需防御性编程,确保异常不影响整体界面。
四. 改进建议及总结
实验设计分层化
现状: 实验难度梯度不合理,部分学生因基础薄弱(这里更强调的是数学逻辑算法思维基础)难以完成算法复杂任务,例如电梯单部调度问题,没必要设计这种算法题目,我个人在写完这(3次作业)道题后,没有学到任何有关面向对象程序设计的感觉(注: 是感觉)(也可能是我能力太菜了),甚至有点学不下去了,毫无意义(个人感觉)。
建议:
强制语法、面向对象思维练习(如重写equals()方法)。
结合设计模式(如使用JavaFX实现图形绘制)(JavaFX建议学习到继承或抽象类的时候就开始接触,到最后短期内要花费很长很长时间去了解并且深入学习敲UI控件,★★★★★ 这很吃操作的)。