✌OOP课程第三次总结
不知不觉中,一个学期转瞬即逝,马上就要结束大一的生活,完成一个身份的转变,成为大二的学长了。在这个学期中,学习了面向对象技术,同时也认识到了面向对象与面向过程的区别。
就是在数据和操作这些数据的方法绑定在一起,通过private修饰属性,并隐藏对象的内部实现细节。在题目集4中的创建圆形类,将半径radius设置为私有属性,通过getter/setter访问,并将计算面积cal封装在这个类的内部。


就是从已经存在的类中定义新的类,这些类有共同的属性,但要注意的是Java只支持单继承,不支持多继承,对super关键字的使用。继承让代码复用成为可能,在题目集9中的魔方问题中,正方体魔方和正三棱锥魔方都继承于魔方这个类,有共同的求面积和求体积的方法。


就是使用父类型对象的地方都可以使用子类型对象。在题目集9中的航空货运管理系统中,其中选择支付方式就是使用了多态,先创建父类对象Payment,然后再根据客户需求将子类引用赋值给父类。

就是父类定义了相关子类的共同行为(共同特征),但要注意的是抽象类不能实例化对象,用abstract修饰。在实验四,定义了抽象父类动物类,大象、狮子和老虎继承于(abstract)动物类,由于它们都有叫和比较战斗力的行为。于是就在父类中定义抽象方法,让子类去Override。
接口是一种与类相似的构造,用于为对象定义共同的操作。以Comparable接口为例,定义了ComparaTo方法,用于比较对象。在实验四中,就用到了这个接口,用于比较动物的直接战斗力。

它们之间的关系有关联、依赖、组合(生存期一致)、聚合(生存期不一致)和继承。对区分关联关系和依赖关系有所欠缺,有时候会把它们两者搞混。关联可以通过成员变量实现,是长期关系。而依赖通过方法参数实现,关系是临时。
继承
class A extends B
关联
class A { private B b; }
依赖
void foo(B b)
聚合
class A { private B b; }
组合
class A { private B b = new B(); }
解决了数组的局限性。集合框架主要有List,Set,Map等,Set和Map集合框架也是我最不熟悉的点,在后续中还是要多加练习。Set是无序,不可重复的集合,常用实现类有 HashSet、TreeSet、LinkedHashSet 等。Map用于存储键值对(key-value),键唯一,值可重复,常用实现类有 HashMap、TreeMap、LinkedHashMap 等。

异常是运行时错误。异常处理使得程序可以处理运行时错误,并且继续正常的执行。在此次的JavaFx的大作业中,在从文件中读取数据的时候就用到了异常处理。如何有异常,就会被catch抓住,并印异常的堆栈跟踪信息(Stack Trace)。如果没有异常就执行try语句块。
| 类别 | 检查型异常 (Checked) | 非检查型异常 (Unchecked) | 错误 (Error) |
|---|---|---|---|
| 继承关系 | Exception | RuntimeException | Throwable |
| 处理要求 | 必须捕获或声明throws | 可忽略 | 不应捕获 |
| 示例 | IOException | NullPointerException | OutOfMemoryError |
JavaFx可以用来开发GUI程序。由于现在在做飞机仪表盘项目,使用的是C语言ege,跟它比较起来,JavaFx真是对用户太好了。下面我想向大家推荐一款软件,它叫SceneBuilder,是专为 JavaFX 应用程序开发 打造的 图形化布局工具 ,无需手动编写大量 UI 代码。借助直观的拖放操作,把按钮、文本框、表格等 UI 组件放到设计面板,还可自动生成对应的 FXML 代码。比如现在做的JavaFx的大作业(航空货运管理系统),就可以使用SceneBuilder来提高我们的工作效率。



在进行类与类设计的时候,我们要遵守以下原则:开闭原则(OCP)、里氏代换原则(LSP)、依赖倒转原则(DIP)、合成复用原则(ARP)、接口隔离原则(ISP)、迪米特法则(LOD)等。

1)工厂模式
定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。
| 模式 | 特点 | 适用场景 |
| 简单工厂 | 一个工厂类,通过参数创建不同产品 | 产品较少且不经常变化 |
| 工厂方法 | 每个产品对应一个工厂类 | 需要灵活、可扩展的系统 |
| 抽象工厂 | 一个工厂创建一系列相关产品 | 需要保证产品兼容性的系统 |
2)单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
饿汉式
public class EagerSingleton {
// 类加载时就初始化
private static final EagerSingleton instance = new EagerSingleton();
// 私有构造方法
private EagerSingleton() {}
// 全局访问点
public static EagerSingleton getInstance() {
return instance;
}
}
懒汉式
双重检查锁
public class DCLSingleton {
// volatile保证可见性和禁止指令重排序
private static volatile DCLSingleton instance;
private DCLSingleton() {}
public static DCLSingleton getInstance() {
if (instance == null) { // 第一次检查
synchronized (DCLSingleton.class) {
if (instance == null) { // 第二次检查
instance = new DCLSingleton();
}
}
}
return instance;
}
}
3)适配器模式
将一个类的接口转换成客户期望的另一个接口,使得原本由于接口不兼容而不能一起工作的类可以一起工作。主要是有类适配器和对象适配器。
4)策略模式
定义一系列算法,将每个算法封装起来,并使它们可以互相替换。策略模式让算法独立于使用它的客户而变化。
(1)在给变量命名的时候要注意命名规则,遵守驼峰命名法,不要随便给变量起名字。
(2)在前几次的题目集中,出现了把有些类写在Main方法中的情况,复用性极差。就是不要把什么东西都往Main里面塞。

(3)不管写哪个类时,最好要加一个空参的构造方法,以免后续出现错误。
(4)要及时转换思维,不要用面向过程的思维去考虑面向对象的问题,避免重复造轮子。
(5)类与类之间的关系设置不当,导致逻辑混乱。
(6)不要只是为了通过测试点,拿到分,而追求代码能跑就行,我们应该提高代码的质量。
System.out.println("感谢老师和同学们!");
浙公网安备 33010602011771号