第三次blog作业 面向对象语言的总结

一.前言

一年的学习java很快就要结束了,我也经历了水与火的淬炼。我的心路历程从困惑到理解再到应用,刚开始接触Java时,面向对象的概念让我十分困惑。"类"、"对象"、"继承"、"多态"这些术语听起来抽象而难以捉摸。但随着不断实践,特别是通过写Java大作业,这些概念逐渐变得清晰起来。记得当我第一次成功实现一个大作业时,那种"顿悟"的感觉令人难忘。虽然整个过程很辛苦,但是确实学到了很多东西。
这门课程分为blog作业,PTA作业,学堂在线线上课程,实验课,以及线下课程总共5个大环节。

(1)线上课程:

主要目的是作为引路人,教会我们java的一些基本语法,让我们从面向过程的C语言转向面向对象的java语言。

(2)线下教学:

我们亲爱的蔡老师从第一节上课就告诉我们上课不会讲一些基本语法,而是讲一些书本上没有的东西,主要是通过一些例子让我们彻底理解java作业设计思路,老师并不会古板的照搬照抄PPT,而是从我们最薄弱的设计思路讲起。最后还给了我们每个人自我发挥的机会,进行了javaFX的翻转课堂讲解。

对于线下课堂的学习还是很满意的。

(3)PTA作业:

总共有11次作业,包括从基础的语法到面向过程设计的大作业,虽然有很多来自之前的C语言题目集,但是主要是为了让我们熟悉java的基本语法,后面的难度都是逐步递增的,都是对每一周学习内容的应用,印象最深的是第一次大作业电梯调度,第一次对题目的分析不够透彻,理不清包括当时很多语法不够熟悉,花了数小时结果也不够明显。总的来说题目虽然难度不小但题量并不算大。

(4)实验:

总共完成了5次实验,但其实总共也就是“把大象放进冰箱”这一个题目的迭代,也是对知识的一步步深入应用,从封装到继承多态再到最后的javaFX界面的应用,除了最后一个界面自学需要花大量时间外别的工作量并不算大,最最最难受的就是那个提交系统,我说实话老师的初衷可能是锻炼我们的敲代码的速度吧,但是这个系统版本实在有点太低太低了,基本的复制你得有吧,可以禁用整体复制,但是局部复制你得有吧,再有就是最基本的对其和中文转换,要不然跟在用记事本写代码有什么区别,还有就是后续写完之后的修正,运行报错之后没有给行数的显示,知道错误在哪但是根本找不到真的写的有点烦人,每次一搞就要7~10个小时,这个系统真的太脆弱了,第一次写到半夜12点我点了一下保存他给我显示什么系统错误直接大退,然后全部拜拜白写,真的很崩溃,第二次我写完但是文件名错了,我问了一圈他跟我说竟然无法更改我又要重写,真的很不敢相信。

(5)blog作业:

blog和我们的实验报告有一点点相似,但实验报告更像是观后感,书写自己的作业过程偏向书面化,而blog更像是自己的日记本,吐槽自己的愚蠢和不足,把自己踩得坑分享出来,在这里也能看的别人犯的错,哈哈还是很有感触的并且能够及时避免,总的来说任务量并不算大写的心情也很复杂。

二.技术总结

封装

比如你有一个存钱罐:
钱放在罐子里,别人看不见也摸不着
投币口(setter方法)是唯一能放钱进去的入口
取钱(getter方法)是唯一能拿钱出来的方式
这就是封装——把重要的东西藏起来,只留几个安全的"窗口"来操作,提高了代码的灵活性,可维护性。

如:对之前电梯调度程序进行迭代性设计,目的为解决电梯类职责过多的问题,类设计要求遵循单一职责原则(SRP),要求必须包含但不限于设计电梯类、乘客请求类、队列类以及控制类,具体设计可参考如下类图。

继承

假如你是一个小孩:
你自动拥有了你爸妈的眼睛颜色、血型等特征(继承属性)
你天生就会像爸妈一样走路、说话(继承方法)
但你可以发展自己独特的能力,比如玩手机比爸妈溜(扩展新功能)
特点:
单继承:Java中一个类只能有一个亲爸(但可以有多个爷爷)
方法重写:子类可以修改继承来的方法(比如@Override)
super关键字:访问父类的方法/属性

我觉得很经典的就是雨刷系统,我在线上课堂听了一次,在线下老师又讲了一次,并且在PTA上又写了一遍

多态

例如一个音箱:
播放音乐,它就会播放
如果你订阅了QQ音乐,它就播放QQ音乐的歌曲
如果你换成了网易云,它就自动切换成网易云的歌曲
下面是一个具体的例子
class 动物 {
void 叫() {
System.out.println("叫");
}
}
class 狗 extends 动物 {
@Override
void 叫() {
System.out.println("汪汪汪!");
}
}
class 猫 extends 动物 {
@Override
void 叫() {
System.out.println("喵喵喵~");
}
}
public class main {
public static void main(String[] args) {
动物 我的宠物;
我的宠物 = new 狗(); // 实际是狗
我的宠物.叫(); // 输出"汪汪汪!"
我的宠物 = new 猫(); // 换成猫
我的宠物.叫(); // 输出"喵喵喵~"
}
}

抽象类

想象你去麦当劳点餐:
菜单上有个"汉堡"大类(抽象类)
但你不能直接点"汉堡",必须点具体的"巨无霸"或"麦香鸡"(具体子类)
麦当劳规定所有汉堡都必须有面包和肉饼(抽象方法必须实现)
特点:
不能被实例化,可以包含抽象方法:用abstract修饰,也可以包含普通方法:可以有已经实现的方法
子类必须实现所有抽象方法:除非子类也是抽象类

接口

就像电源插座:
它规定所有电器插头必须是两脚插
不管电视、冰箱还是手机充电器,只要符合这个标准就能用(实现接口)
插座不关心电器内部怎么工作,只管能不能插(只定义规范,不关心实现)
这个接口是开关
class Light implements Switchable {
@Override
public void turnOn() {
System.out.println("灯亮了");
}
@Override
public void turnOff() {
System.out.println("灯灭了");
}
}
class Fan implements Switchable {
@Override
public void turnOn() {
System.out.println("风扇开始转动");
}

@Override
public void turnOff() {
System.out.println("风扇停止转动");
}
}
灯泡和风扇都实现开关的功能

工厂类

想象你去奶茶店点单:
你不用关心奶茶是怎么制作的
只要告诉店员"要一杯珍珠奶茶"(传入参数)
店员(工厂)根据你的要求制作并给你成品(返回对象)
interface 奶茶 {
void 制作();
}
class 珍珠奶茶 implements 奶茶 {
@Override
public void 制作() {
System.out.println("制作珍珠奶茶:红茶+牛奶+珍珠");
}
}
class 水果茶 implements 奶茶 {
@Override
public void 制作() {
System.out.println("制作水果茶:绿茶+芒果+草莓");
}
}
// 奶茶工厂
class 奶茶工厂 {
public static 奶茶 制作奶茶(String 类型) {
if ("珍珠".equals(类型)) {
return new 珍珠奶茶();
} else if ("水果".equals(类型)) {
return new 水果茶();
}
throw new IllegalArgumentException("没有这种奶茶");
}
}

工厂和接口的关系

工厂是生产车间,接口是产品标准:
工厂负责生产(创建对象)
接口负责规定(定义对象能做什么)
工厂生产的产品必须符合接口标准

异常处理

try是正常流程
catch是赔偿方案
finally是事后清理
throws/throw是风险转移
代码结构
try {
// 可能抛出异常的代码
FileInputStream fis = new FileInputStream("file.txt");
} catch (FileNotFoundException e) {
// 处理特定异常
System.out.println("文件未找到: " + e.getMessage());
// 记录日志
logger.error("文件读取失败", e);
} catch (IOException e) {
// 处理更通用的异常
System.out.println("IO错误: " + e.getMessage());
} finally {
// 资源清理(总会执行)
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
System.out.println("关闭文件流失败: " + e.getMessage());
}
}
System.out.println("清理工作完成");
}

javaFX

下面是老师课上讲解的关键组件
Stage 窗口
Scene 场景(窗口中的内容容器)
Node 所有 UI 控件的基类(按钮、文本等)
Layout 布局管理器(VBox, HBox, GridPane)
ObservableList 动态数据集合(用于绑定 UI 数据)
这部分的基础语法主要是通过翻转课堂上同学们的讲解以及通过AI软件进行自学,但是这方面的基本应用语句好多,目前还在努力学习中。

集合框架

之所以把这个放在最后,是因为对这一部分应用的真的不多,在总结前又在网上查阅了一些资料

目前也只学习了大概框架,对里面的算法以及具体用法了解还不够透彻,其实这个对一些算法的帮助还是很大的,但是之前对这一部分有莫名的恐惧,以后要加强对这一方面的学习

三.踩坑心得

(1).逻辑错误

上学期接触的题都比较简单,很少有逻辑问题,这个问题比较容易忽略,我刚开始写第一次作业时写完给我报的是运行错误,我以为只是一些循环存在问题,还在沾沾自喜,殊不知噩梦已经悄然降临,我改啊改,咋改都改不完,后来才发现是电梯运行的逻辑问题,好不容易改完了又会发现是答案错误等各种问题
还有就是一些代码的逻辑问题,这个要具题目而定,就比如电梯逻辑要分清楚内外部请求



(2).类的设计

从第一次拿到一个题目时,我们就要全面就行分析,想想能否继续扩展,类的设计一定要符合单一职责原则,每个类只负责一个功能,里氏代换原则,子类可以替换父类而不影响程序,开闭原则,对扩展开放,对修改关闭,合成复用原则,优先使用组合而非继承,依赖倒转原则,依赖抽象,而非具体实现,这些都是我们设计类时要遵守的原则,一定要想好再开始写。

四.总结

学习这门课一定要有好的学习方法,最最最关键的是要养成自学的习惯,要不然我只能说90%要完蛋。
要循序渐进不断学习提高
(1).基础语法突破,这个大部分人应该都没什么问题,因为我们上学期已经系统的学习过了C语言,一些基本的语法点都是相似的问题不大。
(2).核心概念理解,方法定义与重载,数组使用 (一维/二维数组),面向对象三大特性:封装,继承,多态。
(3).面向对象类的设计思路以及遵守的原则:单一职责原则,每个类只负责一个功能,里氏代换原则,子类可以替换父类而不影响程序,开闭原则,对扩展开放,对修改关闭,合成复用原则,优先使用组合而非继承,依赖倒转原则,依赖抽象,而非具体实现,这一阶段主要来源于线下课堂的讲解,老师对我们思路的扩展
(4).大作业的训练:进行一些复杂程序的设计,同时考察逻辑思维,例如电梯调度分析。
(5).进阶学习:这一部分知识点比较抽象复杂,量非常大并且非常系统很有难度,比如javaFX界面交互,以及集合框架的学习等等。
总结:实践出真知
看10遍不如写1遍
作业踩坑才是最佳老师
长期主义
语法易学,精髓难掌握
java语言需要持续学习

posted @ 2025-06-20 13:38  沉溺于世界  阅读(34)  评论(0)    收藏  举报