第三次Blog作业——对java课程的总结

前言:

转眼间,这学期紧张而充实的Java学习接近尾声。本门java课正式的告诉我 上大学可以这么累。上大学可以这么可怜。我看到在南昌大学学医的同学课比我少,我认。在江西农业大学学农的同学一周一节课,我认。同学对我说 你怎么26号就放假了呀!他们不知道我是7月26号才放假。回顾这段时间,课程的压力、知识的深度,确实常常让人感到喘不过气。但此刻静下心来整理笔记,心中更多的是一种历经挑战后的平静,以及一丝坚持下来的欣慰。这学期的Java课程,内容之多、节奏之快,远超我的预期。学的我要死不活 好歹是坚持下来了 接下来是我的个人的心得与体会。

面向对象技术总结:

这学期的Java学习之旅,终于跨越了面向对象编程(OOP)最核心的几个基石:封装、继承、多态、抽象类、接口,并初步接触了图形界面开发JavaFX以及程序健壮性的守护者异常处理

 

 

1. 面向对象的基石:封装、继承、多态

  • 封装 (Encapsulation): 这是我理解面向对象的第一把钥匙。它的核心思想是把数据(属性)和操作数据的方法(行为)捆绑在一个单元(类)中,并对外隐藏对象内部实现的细节。通过使用 private 修饰属性,并提供公共的 getter 和 setter 方法进行访问和修改,实现了:

    • 数据保护: 防止外部代码随意修改内部状态,保证了数据的有效性和安全性。

    • 代码模块化: 将复杂的实现细节隐藏起来,使用者只需关注类提供的公共接口(方法),降低了使用复杂度。

    • 易于维护: 内部实现的修改只要不改变公共接口,就不会影响使用该类的其他代码。这在实际编程中非常重要,也是我在设计类时首要考虑的原则。

  • 继承 (Inheritance): 它允许我们基于一个已有的类(父类/超类)来创建新的类(子类/派生类)。子类继承了父类的属性和方法(非 private 的),并可以:

    • 复用代码: 避免重复编写父类已有的代码,提高了开发效率。

    • 扩展功能: 在子类中添加新的属性和方法,或者覆盖 (Override) 父类的方法以满足子类的特定需求(这是实现多态的关键基础)。理解 extends 关键字和 super 关键字(用于调用父类构造方法或成员)是掌握继承的核心。

  • 多态 (Polymorphism): 这是OOP中非常强大且富有魅力的特性,意为“多种形态”。它允许我们使用父类类型的引用指向子类对象,并在运行时根据实际对象的类型来调用相应的方法。主要体现为:

    • 方法重写 (Override): 子类对父类方法进行重新实现。这是运行时多态的基础。

    • 向上转型 (Upcasting): Parent p = new Child(); 父类引用指向子类对象。

    • 动态绑定 (Dynamic Binding): 在程序运行时(而非编译时),JVM根据引用变量 p 实际指向的对象类型(Child)来决定调用哪个类(Child)的 method()。这使得程序设计更灵活、更易扩展。理解“编译看左边(父类),运行看右边(子类)”这句总结对我掌握方法调用的规则帮助很大。

2. 抽象与契约:抽象类与接口

  • 抽象类 (Abstract Class):

    • 使用 abstract 关键字修饰的类。

    • 不能直接实例化,只能被继承。

    • 可以包含 abstract 方法(只有声明,没有实现,要求子类必须实现)和具体方法(有实现的方法)。

    • 也可以包含普通属性和方法。

    • 作用: 为相关类提供一个通用的模板部分实现,强制要求子类完成特定抽象方法的实现。它介于普通类和接口之间,适合存在一些共性实现但又需要子类各自实现特定行为的情况。

  • 接口 (Interface):

    • 使用 interface 关键字定义。

    • 在Java 8之前,只能包含抽象方法 (public abstract 可省略) 和常量 (public static final 可省略)。Java 8+ 允许包含 default 方法和 static 方法。

    • 一个类使用 implements 关键字来实现一个或多个接口,必须实现接口中所有的抽象方法(除非该类是抽象类)。

    • 作用: 定义了一组行为规范能力契约。它只关心“做什么”,不关心“怎么做”(由实现类负责)。接口的核心价值在于:

      • 完全抽象: 比抽象类更纯粹地定义行为。

      • 实现多继承: Java类不支持多继承,但一个类可以实现多个接口,从而获得多种行为。

      • 解耦: 定义标准,降低模块间的依赖。例如,排序功能只需要对象 implements Comparable 接口并实现 compareTo 方法即可。

3. 构建用户界面:初识JavaFX

  • 这是Java提供的用于创建桌面图形用户界面(GUI)的现代库(取代了早期的AWT和Swing)。

  • 核心概念:

    • Stage (舞台): 应用程序的顶级窗口。

    • Scene (场景): 容纳所有UI组件的容器,设置于Stage上。

    • Node (节点): 所有UI组件(控件如 ButtonLabelTextField;布局如 VBoxHBoxGridPane;形状等)的基类。节点构成Scene Graph(场景图)。

  • 布局管理: 使用 Pane 的子类(如 VBoxHBoxBorderPaneGridPane)来组织和自动调整组件的位置和大小,适应不同窗口尺寸,比手动设置坐标更灵活可靠。

  • 事件处理 (Event Handling): GUI的灵魂。为控件(如按钮 Button)添加事件监听器(如 setOnAction),在用户交互(如点击)发生时执行相应的代码逻辑。这让我编写的程序真正开始“活”起来,能与用户进行交互。

  • 初步体验: 通过动手创建简单的窗口、添加按钮文本框、处理按钮点击事件,感受到了GUI编程的基本流程和乐趣,虽然界面还很简单,但看到自己写的程序有了可视化的界面,很有成就感。

4. 程序的守护者:异常处理

  • 什么是异常 (Exception): 程序在运行时发生的非正常情况或错误(如:除以零、数组越界、文件不存在、网络连接中断等)。

  • 为什么需要处理: 如果不处理异常,程序会崩溃并打印错误堆栈信息,用户体验极差。异常处理机制使程序能够优雅地应对错误,尝试恢复或至少给出友好的提示信息后安全退出。

  • 核心机制 (try-catch-finally):

    • try 块: 包含可能抛出异常的代码。

    • catch 块: 捕获并处理特定类型的异常(Exception 或其子类)。可以有多个 catch 块处理不同类型的异常。

    • finally 块: 无论是否发生异常,最终都会执行的代码块,通常用于释放资源(如关闭文件流、数据库连接)。finally 块非常关键,确保了资源的清理。

  • 异常类型: 区分 RuntimeException (运行时异常/非受检异常,通常由编程错误导致,不强制处理) 和 Exception 的其他子类 (受检异常,编译器强制要求处理,要么 try-catch 要么在方法签名上用 throws 声明抛出)。

  • 实践体会: 在文件操作、网络请求等地方主动使用 try-catch 块来处理潜在的 IOException 等异常,并确保在 finally 中关闭资源,显著提高了程序的健壮性和可靠性。理解 try-with-resources (Java 7+) 语法对简化资源关闭非常有帮助。

 

 

踩坑心得:

1.代码就别重构了 我是重构不来
重写代码:就像给旧房子重新打地基,虽然麻烦,但有时候能让它稳如泰山。
重构代码:就像给旧房子换个新屋顶,虽然能解决问题,但有时候房子本身已经摇摇欲坠了。
所以,代码尽量不要重构而是重写,就是说,有时候与其费力修补一个破旧的系统,不如直接推倒重建,这样可以确保代码的质量和可维护性,虽然这可能需要更多的精力和时间,但从长远来看,它能带来更稳定和高效的结果。

2.读题很重要啊

不认真读题可能会让你在完成任务后发现需要大量返工。这就像在建房子时没看清楚设计图,结果建了一半才发现你造的是一个厕所而不是一个卧室。认真读题可以帮助你避免这种“返工”的烦恼。能够帮助你避免那些让你拍脑袋的“低级错误”。你可能会想,“我直接动手做,再回来读题也不迟。” 但事实上,误读题目可能会让你浪费大量时间。认真读题不仅仅是为了避免错误,更是为了提高效率、增强自信并确保任务顺利完成。就像在航海中,你需要仔细研究航海图,才能确保船只航行在正确的航线上。

3.调试很爽啊F6我按不停的

调试就像是在代码里挖地雷,你永远不知道下一行代码会不会让你中招。通过调试,你可以发现那些隐藏的错误。可以帮助你理解代码的实际执行流程,避免你在脑海里无休止地模拟程序运行。这样可以保存你的脑细胞,让你有更多的精力去解决真正重要的问题。帮助你更好地理解代码的逻辑和潜在问题。每一次调试都是一次提升编程技能的机会,让你在未来的开发中更加得心应手。调试是编程过程中不可或缺的一部分,它不仅有助于发现和解决问题,还能提升你的编程技能和信心。就像医生需要听诊器来诊断病人的心跳一样,程序员需要调试工具来检查代码的状况。

eg:

惨痛经历: 多少次程序编译失败,或者运行时出现诡异错误,最终定位到的原因让人哭笑不得:一个分号 ; 写成了全角 ,一个英文逗号 , 写成了中文逗号 ,该用 == 比较的地方用了 = 赋值,if 条件后面少了个括号 {},或者关键单词拼写错误(Applicants 写成 Appilcants)。更隐蔽的是,有时空格的位置不对(比如方法名和括号之间多了一个空格),也可能导致编译器不认或者逻辑错误。这些错误往往藏得很深,在密密麻麻的代码里很难一眼发现,消耗了大量调试时间。

深刻教训: 编码时必须极度关注细节! 养成良好的输入习惯:

    1. 确保输入法在英文状态下编写代码(除了字符串和注释内容)。

    2. 注意符号的全半角。 所有编程符号(; , {} () [] = == + - 等)都必须是半角英文符号

    3. 仔细检查拼写。 类名、方法名、变量名、关键字都不能拼错。IDE的提示和错误标记是帮手,但自己也要细心。

    4. 注意格式规范。 保持一致的缩进(IDE通常能自动格式化 Ctrl+Alt+L),注意空格的使用(虽然Java对某些空格不敏感,但规范使用能提高可读性并避免一些意外错误)。

    5. 利用IDE的实时检查。 现代IDE(如IntelliJ IDEA, Eclipse)会在你输入时实时标记语法错误和部分拼写错误,养成边写边看的习惯。

踩这些坑的过程虽然痛苦,但也正是这些教训让我深刻体会到,编程不仅仅是写出能运行的代码,更要写出清晰、可维护、健壮的代码。 好的习惯(设计先行、注重细节、勤写注释、规范命名)从学习阶段开始培养,受益无穷。

总结:

学习封装、继承、多态、抽象类和接口,让我真正理解了面向对象编程的精髓——用对象模拟现实世界,通过封装隐藏细节,通过继承实现复用和层次化,通过多态实现灵活扩展,通过抽象类和接口定义规范和契约。JavaFX 的初步实践,则让代码从冰冷的命令行走进了有温度的图形界面,理解了事件驱动模型。而异常处理,是编写健壮、可靠程序的必备技能。

虽然这些只是Java庞大知识体系的开篇,学习过程中也时常会遇到概念理解上的卡壳和代码调试的困扰(正如在之前笔记中记录的),但每当通过查阅资料、动手实践、反复思考后弄明白一个点,或者成功运行起一个带有界面、能处理异常的小程序时,那种豁然开朗和点滴积累带来的成就感,是支撑我继续前行的动力。

作为南昌航空大学24201718班的一员,我深知这只是开始,后续还有集合、IO流、多线程、网络编程、数据库连接等更深入的内容等待着探索。但掌握了这些OOP的核心思想和基础技能,让我对未来的学习有了更强的信心。路虽远,行则将至。 我会继续坚持,一步一个脚印地记录和消化每一个知识点。

 

谢谢助教老师 谢谢老师 别挂我科 我求你们了 真的....

posted @ 2025-06-19 15:43  Gindama  阅读(16)  评论(0)    收藏  举报