一、前言
Java作为一门面向对象的编程语言,对于作为软件工程专业的我们来说,在本学期的课程学习中占据着核心地位。回顾整个学期的学习历程,Java课程通过多种教学形式(Blog作业、PTA作业、实验、学堂在线线上课程以及线下课程)全面培养了我们的编程能力和面向对象思维。而我们也深知Java对于我们的重要性,不敢对此有丝毫懈怠,从工作量来看,本课程的PTA作业和实验任务量适中但富有挑战性,每周大约需要投入8-10小时(包括每周的实验课在内)来完成相关任务。而Blog作业作为总结性任务,要求我们对所学知识进行系统梳理,这种形式既检验了学习成果,也促进了知识的深化理解。当然线上课程提供了灵活的学习方式,能让我们自主进行相关知识点的预习和复习,强化了我们的基础概念记忆,而最主要的线下课程不仅通过罗老师生动的教学传授我们知识,还创新性的提出了翻转课堂这种师生互动学习了JavaFX的课程。难度方面,课程设计呈现渐进式特点。从基础的语法和面向对象概念开始,逐步深入到集合框架、异常处理和JavaFX应用开发。我们逐渐从C语言的思维模块走出来,特别是从过程式编程思维向面向对象思维的转变,对许多我们来说是一个不小的挑战。PTA作业中的编程题目往往需要综合运用多个知识点,这对我们的问题分析和解决能力提出了较高要求。而实验更是对我们的创新能力和各方面的综合训练能力提出挑战,也对我们自主开发给出了更多想象空间。
二、面向对象技术总结
1. 封装
封装是面向对象的基础特性之一,通过将数据和行为包装在类中,并控制对内部实现的访问,提高了代码的安全性和可维护性。在PTA作业和五个实验中,我深刻体会到封装的价值:
- 通过private修饰符隐藏内部数据,提供public方法进行访问控制
- 使用getter和setter方法管理属性访问
- 将相关操作组织在同一个类中,减少代码耦合
短板:对某些复杂场景下的封装粒度把握还不够准确。有时候会违规访问不同类间的成员
2. 继承
继承机制允许我们基于现有类创建新类,实现代码复用和层次化设计。通过实验中的案例(尤其是电器动物类)分析:
- 理解了extends关键字的使用
- 掌握了方法重写(Override)的规则和@Overide注解
- 认识到继承关系中的is-a原则的重要性
短板:最初认为继承主要是为了代码复用,后来理解了它更重要的作用是建立类之间的层次关系,实现多态。但在设计复杂的继承体系时,有时会出现层次过深的问题
3. 多态
多态是面向对象最强大的特性之一,它允许同一操作作用于不同类的对象而有不同表现。在作业和实验(比如实验中的比较排序类)中:
- 通过方法重写和接口实现多态行为
- 理解了向上转型和向下转型的应用场景
- 掌握了instanceof操作符的使用
短板:对某些复杂多态场景(如结合泛型使用)的理解还不够深入
4. 抽象类与接口
抽象类和接口是Java中实现抽象的两种重要机制(动物攻击力接口):
- 理解了抽象类可以包含具体方法和抽象方法,适合作为相关类的共同基类
- 掌握了接口定义契约的能力,一个类可以实现多个接口
- 在实验中运用了接口回调技术
短板:对何时使用抽象类、何时使用接口的判断标准有时还不够明确。
5. 集合框架
Java集合框架提供了丰富的数据结构和算法实现:
- 熟练使用了ArrayList、LinkedList、HashSet、HashMap等常用集合类
- 理解了不同集合实现的性能特点和适用场景
- 掌握了使用迭代器和增强for循环遍历集合
- 在PTA作业中应用Collections工具类进行排序和查找
- 选择正确的集合类型对程序性能有重大影响,例如频繁随机访问应选ArrayList,频繁插入删除则LinkedList更优
短板:对罕见的WeakHashMap、EnumSet等特殊用途集合的使用经验较少
6. 异常处理
Java的异常处理机制帮助构建健壮的程序:
- 理解了checked exception和unchecked exception的区别
- 掌握了try-catch-finally块的使用
- 能够自定义异常类表达特定错误情况
- 在文件操作实验中实践了资源自动管理(try-with-resources)
短板:最初倾向于捕获所有异常而不做处理,后来理解了应当只捕获能处理的异常,否则应向上抛出。有时候搞不清什么时候需要检测
7. JavaFX
JavaFX作为现代GUI框架,我们除了翻转课堂,在航空订单及实验五中进行了运用:
- 学习了FXML与控制器分离的界面设计方法
- 掌握了事件处理机制和属性绑定
- 在综合实验中实现了简单的图形界面应用
短板:从控制台程序转向事件驱动编程需要思维方式的转变,初期不太适应回调机制
8.文件读取功能
在五个实验中,老师要求我们都使用文件读取的模式来输出动物及电器的信息,而我觉得这是一个很重要的点:
- 用File类表示文件和目录
- 检查文件是否存在:file.exists()
- 判断是文件还是目录:file.isFile()/isDirectory()
短板:文件操作类应该职责单一,刚开始注意合理处理IO异常,没有读取绝对路径
三、采坑心得
1. 对象相等性判断
问题:在早期作业中,直接使用==比较对象内容,导致逻辑错误。
点击查看代码
Student s1 = new Student("张三", 20);
Student s2 = new Student("张三", 20);
System.out.println(s1 == s2); // false
领悟:对于自定义类,总是同时重写equals()和hashCode(),并使用Objects.equals()进行安全比较。
点击查看代码
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student s = (Student) o;
return age == s.age && name.equals(s.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
2. 集合修改异常
问题:在遍历集合时尝试修改集合导致ConcurrentModificationException。
点击查看代码
for (String s : list) {
if (s.equals("B")) list.remove(s); // 报错
}
领悟:使用迭代器的remove()方法,或创建集合的副本进行操作
点击查看代码
Iterator<String> it = list.iterator();
while (it.hasNext()) {
if (it.next().equals("B")) it.remove(); // 安全删除
}
3. 过度继承
问题:在设计类层次时创建了过深的继承链,导致系统僵化
点击查看代码
class Animal {}
class Mammal extends Animal {}
class Dog extends Mammal {} // 继承层次过深
领悟:优先使用组合而非继承,保持类层次扁平化
点击查看代码
interface Runner {}
interface Swimmer {}
class Dog implements Runner, Swimmer {} // 使用接口替代继承
4.文件读取错误
问题:文件路径不对。有时候写的是相对路径,但程序运行时的工作目录和想的不一样。还有时候文件明明存在,但程序说找不到
点击查看代码
File file = new File("data.txt"); // 相对路径可能出错
BufferedReader br = new BufferedReader(new FileReader(file));
领悟:用绝对路径更可靠,并把文件放在项目根目录下,最后用getClass().getResource()获取资源路径
点击查看代码
// 方法1:使用类路径资源
InputStream in = getClass().getResourceAsStream("/data.txt");
// 方法2:使用NIO
Path path = Paths.get("data.txt");
List<String> lines = Files.readAllLines(path, StandardCharsets.UTF_8);
5.finally块中的return:
问题:
public int test() { try { return 1; } finally { return 2; // 实际返回2 } }
finally中的return会覆盖try中的return
领悟:避免在finally中使用return
四、改进建议及总结
课程改进建议
-
教学组织方面:
- 增加阶段性综合练习,帮助学生在学习过程中整合知识点
- 提供更多真实案例,展示Java在企业应用中的实际使用场景
- 考虑引入结对小组编程等协作学习形式
-
作业与实验方面:
- 在PTA作业中增加更多基础题目,不要出现难度较大的高分题目
- 实验指导书可以提供更多设计思路提示,而非仅给出具体要求
- 增加代码审查环节,促进学生间相互学习
-
线上资源方面:
- 建立常见问题知识库,减少重复答疑
- 增加在线编程练习的即时反馈机制
-
考核评价方面:
- 可以考虑加入小型项目作为考核部分,评估综合应用能力
- 对Blog作业提供更详细的评价标准
个人学习总结
通过本学期的Java课程学习,我不仅掌握了Java语言的基本语法和面向对象编程技术,更重要的是培养了面向对象的设计思维。从最初的面向过程思维,到能够运用封装、继承、多态等特性设计结构良好的程序,这一转变过程虽然充满挑战,但也带来了巨大的收获。课程中的PTA作业和实验任务设计合理,既巩固了基础知识,又提供了足够的挑战。我已经深刻认识到大量练习的必要性。Blog作业的形式促使我进行系统性的知识梳理,这种反思过程极大地加深了对概念的理解。线上课程的灵活性配合线下课程的互动性,形成了良好的学习体验。在学习过程中,我认识到编程能力的提升不仅依赖于语法知识的积累,更需要通过大量实践培养问题解决能力。特别是调试技能的提升,使我能更高效地定位和解决问题。面向对象技术的掌握是一个渐进的过程,虽然目前对某些高级特性(如泛型、Lambda表达式等)的应用还不够熟练,但已经建立了坚实的基础,为后续深入学习铺平了道路。总的来说嘛,本门Java课程设计系统全面,教学方式多样,有效培养了我的编程能力和面向对象思维。通过课程学习,我不仅获得了技术知识,更重要的是培养了持续学习和解决问题的能力,这将对我未来的专业学习发展产生长远影响。希望再接下来的编程学习里,我能够再接再厉,自我勉励,做到更好,成为一名优秀的昌航软件人!
浙公网安备 33010602011771号