南昌航空大学Java课程总结Blog3
一、前言
这门课程被分成了Blog作业、PTA作业、实验、线上课程及线下课程五大环节,每一个环节都紧紧相扣,相互促进,让我们对面向对象的学习更加深刻。线上学习主要学习的是语法知识;线下课程主要是讲解Java原则及重要特征;实验则是根据线下课程的进度对把大象装进冰箱的问题进行迭代;PTA作业与实验类似,也是根据线下课程的进度对各种问题进行迭代,从而懂得如何运用上课所讲的知识点;Blog作业则是对某一阶段的学习进行总结、复盘,回顾自己所遇到的问题及如何解决并梳理所学知识点。
在学习完C语言之后,Java的学习相对比较轻松,更易理解。经过一个学期的学习,我的思维也从面向过程转变到面向对象,懂得如何设计类与方法,让程序变得更高效。
总体来说,Java的工作量及难度都不算大。
- 线上课程:
它的主要目的就是让我们自己学习Java的语法知识,从而懂得如何使用Java编程,视频量也是让我可以接受的。 - 线下课程:
在评价线下课程之前首先得要给我们蔡老师呱唧呱唧,他是一个非常通情达理的老师,在很多想法上都与我们相似,并没有像一些老师古板的延续之前的教学方法与思维,而且他讲课非常的接地气,善于用生活中常见的案列来打比方,让我们更加容易理解所讲知识并且记忆深刻,非常荣幸能被蔡老师所教。
有如此优秀的老师,线下课程自然不是什么问题,非常能够接受。 - PTA作业
这个学期总共布置了11次PTA做作业,其中前4次PTA作业都是来自C语言,但得要用Java的思维来写代码,其他的就是两次(3+2)大作业以及2次单独的PTA,但大多都是对以前的问题进行迭代。其中第一次大作业是难度最大的,主要是对题目理解不清以及不知道如何处理电梯上升与下降的问题。但总体而言,PTA的难度不是很大,题量也不大,一次3题左右,还是能学到很多东西的。 - Blog作业
这个作业能够很好的让我们反思问题,对所遇到的问题有更深的印象,之后也就能轻易解决类似问题,同时也可以让我们总结该阶段所学的知识。这个学期总共三次Blog作业,还是比较少的。 - 实验
之所以要把它放在最后来总结,就凭它有最值得吐槽,最能恶心学生,最能浪费学生时间,最效率底下,最让学生崩溃的实验提交系统。实验作业相比于PTA,简单的不是一点两点,但它让我们学到的东西远不如PTA,而且有时花费的时间比PTA还要多。它最大的特点就是无法复制粘贴,也没有IDEA里的便捷键,就像在World文档里编写代码一样,最后敲完代码发现有七八十个错误,最终还得自己慢慢去找去修改。我很好奇为什么PTA都开了复制粘贴,实验提交系统却不开复制粘贴。最让人崩溃的是实验五,JavaFX里需要调用一大堆夫扎的方法,谁能够记住所有的方法,本来在IDEA里输入几个关键字母就可以出现很多方法供自己选择,而在实验提交系统里编代码还得一个个去查,并且还得仔细看有没有拼错。这里种种恶心人的行为一度让我感到崩溃,甚至还有放弃的念头。
所以,Java这门课程除了实验提交系统,其他的都还是很好,实验提交系统就是最大的一颗老鼠屎。
二、面向对象技术总结
-
封装
封装就是将属性和方法捆绑在一个类里,并隐藏内部实现细节,而且通过private修饰属性,禁止外部访问,只能用set修改属性和get获取该属性。而且一个类处理一个特定的事情,一个方法则是处理该事情中的一个小分支。刚开始的时候我不知道为什么需要set/get,不直接把private直接调用该属性,起初我就是一味的模仿,所有的属性都用private修饰并创建set/get方法,但随着对Java的深入学习,我逐渐理解了这个问题。就好比微信余额这个属性,如果没有private修饰,外部可以直接对其进行修改,用private修饰并创建set/get方法之后可以在set和get中设置一些修改与读取微信余额的条件,这样安全性就可以大大提高。同时封装性跟单一职责原则联系十分密切,一个类只干一件事职责,以后哪些职责出现了错误就可以直接对其修改,便于维护。
-
继承
继承就是子类继承父类的属性和方法,实现代码复用,可以全部继承也可以部分继承。继承其实就是“is-a”的关系,对于相同的方法子类就不需要再写一遍,但Java中只支持单继承。但老师告诉我们复用却不是继承最主要的功能,而是为实现多态提供基础架构。当子类之间有着共同的方法,但它们实现方式却不同时,也可以使用继承,就好比老师上课常讲的动物都会叫,但他们叫的方式却不同,这时候父类就得要有叫这个方法,只不过子类得要对其进行重写,并添加@Override让编译器知道这个方法是对父类方法的重写。同时子类也可以通过supper调用父类成员。目前我对继承的理解大概就这些,可能还有很多功能不是很理解。
-
多态
多态其实是在继承的基础上进行操作,上面我已经将来多态才是继续最大的功能。我对多态的理解主要来自实验,它让我了解到如何使用多态以及为什么要多太。简单代码示例如下:
// 定义动物类
abstract class Animal {
abstract void makeSound(); // 动物发出声音
}
// 狗类继承
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪!");
}
}
// 猫类继承
class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("喵喵~");
}
}
// 鸟类继承
class Bird extends Animal {
@Override
public void makeSound() {
System.out.println("叽叽喳喳");
}
}
public class Main{
public static void main(String[] args) {
Animal sound1 = new Dog();
Animal sound2 = new Cat();
Animal sound3 = new Bird();
// 多态的体现
sound1.makeSound(); // 输出:汪汪汪!
sound2.makeSound(); // 输出:喵喵~
sound3.makeSound(); // 输出:叽叽喳喳
}
}
-
抽象类
抽象类是用abstract修饰的类,一般情况下里面存在抽象方法,即不能被具体化的方法,其实与C语言中函数前置声明非常类似。子类必须继承父类抽象方法并进行重写。上面代码中Animal就是一个抽象类,makeSound()是一个抽象方法。所以说Java中的知识点都不是孤立的,都是环环相扣的。
-
接口
接口是通过interface修饰的类,其方法默认为是public abstract,而且Java支持多接口,就比如把吃和飞设计成两个接口,则小鸟则可以实现这两个接口。接口非常符合开闭原则,即对扩展开放,对修改关闭。我对这个的深入了解主要来自航空货运系统第二次迭代中的Rate,,当Rate的规则发生变化或添加一个新的Rate规则就可直接创建一个新的实现类,并可以创建一个工厂,代码如下:
class RateFactory{
private static final Map<String,Rate> strategies=Map.of("Normal",new Rate1(),"Dangerous",new Rate2(),"Expedite",new Rate3());
public static Rate getRate(String rate){
return strategies.getOrDefault(rate,null);
}
}
这样就可以做到对原代码进行修改,使代码的可维护性增强。同时接口也适用于多态,还是一个变相的多继承。
-
集合框架
该图来自网上,其实我对集合框架了解并不是很深,我主要使用的是List中的ArrayList,在工厂中使用过Map,在最后一次PTA的统计Java程序中关键词的出现次数题我学习了一些Map的知识,起初学完之后我本来想使用TreeMap,将关键词作为键,将出现次数作为值,然后它就会根据键进行排序,只要删掉出现0次的就可以得到答案,但最后我找到了更简单的方法我就放弃了这种方法。虽然没用用到TreeMap,但我对其进行了深入学习,还是学会了一点。还有用到集合框架的就是在实验中使用Collection进行排序。总的来说,集合框架还需要我进一步的学习。
-
异常处理
异常是程序在运行过程中发生的非正常事件,它会打断正常的程序流程,于是我们就得对各种可能出现的异常进行处理,从而在运行的过程中不会中断运行。这部分主要是在线下课程中讲过,但基本上没有在PTA和实验上运用,所以这部分掌握的还是非常少。目前为止,我只知道使用try-catch-finally来处理异常问题并且还可以自定义异常。这就是练习少带来的后果,以后还是得多尝试使用异常处理,既可以提高代码健壮性还可以加深对异常处理的了解。
-
JavaFX
该部分主要以自学为主,让我们自己在课上讲解JavaFX的UI插件。javaFX就是图形界面,与我们C语言课设所使用的ege类似,但javaFX图形界面我感觉比ege好用的很多,大部分插件都可以直接使用不需要自己创建,减轻了很多工作。主要包括Scene,Stage,Node三大组件,而Node又包括所有的UI控件。
常见的布局类包括以下几种,用的最多的是HBox,VBox,GridePane,其中StackPane也在实验中使用过一次,BorderPane目前用的最多的地方是航空货运系统的图形界面中,FlowPane和TilePane目前还未使用过,对它们的了解很少。
布局类 | 描述 |
---|---|
StackPane | 子节点堆叠在中心 |
BorderPane | 上、下、左、右、中五个区域 |
HBox | 水平排列子节点 |
VBox | 垂直排列子节点 |
FlowPane | 流式布局,自动换行 |
GridPane | 网格布局,类似HTML表格 |
TilePane | 平铺布局,统一大小的单元格 |
常见的控件包括以下几种,目前在航空货运系统中大部分都已经被使用过了,对它们还是有一定了解。
控件类名 (JavaFX) | 中文名称 |
---|---|
Button | 按钮 |
Label | 标签 |
TextField | 单行文本框 |
TextArea | 多行文本框 |
PasswordField | 密码输入框 |
CheckBox | 复选框 |
RadioButton | 单选按钮 |
ComboBox | 下拉选择框 |
TableView | 表格视图 |
DatePicker | 日期选择器 |
MenuBar | 菜单栏 |
ColorPicker | 颜色选择器 |
Slider | 滑动条 |
ListView | 列表视图 |
ScrollBar | 滚动条 |
Timeline | 时间轴动画 |
PathTransition | 路径动画 |
三、踩坑心得
- 我踩过最大的一个坑就是电梯第二次迭代时我直接在第一次代码的基础上修改输入然后就提交还得了满分,最后应不符合类的设计得了0分还没机会修改,这让我在之后写PTA的时候非常小心,生怕老师把什么重要信息藏在我不注意看的地方。
- 我写代码的时候基本上是不写注释,这导致我写航空货运系统javaFX的时候对以前我所设计的属性名称都不太清楚,还得仔细看完整个代码,浪费了我大量的时间。虽然在刚开始写的时候节省了一些时间,但再往后修改的时候会让我崩溃。
四、改进建议与总结
总结
在前言部分我已经给出了我对Java这门课程五大环节的总结,总体来说还是非常好的,我学到了很多的东西,对java的特性和原则了解还是比较深的,能够很好的设计类及它们之间的关系,思维也完全转变到面向对象程序设计。
建议
- 这门课程最大的问题就是出现在实验提交系统上,为了我们软件学院的未来,我还是希望老师能够开通复制粘贴的功能,有高效率的编译器为什么不用呢,还非让我们在类似World文档中编译代码,即浪费学生时间,又影响学生心情,甚至会让学生对实验或者这整门课程产生反感。我觉得老师也想我们学生高效的学习这门课程,所以希望老师开通复制粘贴或者放弃实验提交系统,直接在PTA上提交实验代码。
- 希望老师在出题目的时候能够说清楚题目要求,就比如最后一次PTA的找关键字让我们自己去搜索53个关键字,但万万没想到网上有很多的版本,最后在一顿捣鼓后发现还是有错误,最后才想到可能是关键字错了,于是我试了3-4个版本才正确了。还有就是实验中很多要求都不是很明确,最后只能以“我以为的”来编写代码。