(1)ADT 的特性:表示泄漏、抽象函数 AF 、 基于数学的形式对 ADT 、表示不变量 RI
(2)ADT是由操作定义的,与其内部 如何实现无关
(3)四种ADT类型:
Creators 构造器: 用于创建新的实例或对象。
Producers 生产器: 用于从现有实例生成新的实例,通常不会修改原实例,而是返回一个新的实例。(e.g. 合并两个集合返回一个新的集合,将列表转化成一个不可变列表)(本质上为拷贝数据而非改值)
Observers 观察器:用于检查或查询对象的状态,返回有关对象的信息,而不修改对象(e.g.获取栈的大小,检查队列是否为空,获取集合中元素的数量)
Mutators 变值器:改变对象属性的方法(可变性的关键,即只有mutable的对象才能够有Mutators):用于修改对象的状态,直接改变对象的数据或结构
变值器通常返回void,这意味着它改变了对象的某些内部状态
变值器也可返回非空类型
(4)ADT的内部表示 ( 私有属性 ) 对外部都应严格不可见
(5)ADT的规约里只能使用client可见的内容来撰写,包括参数、返回值、异常等。
(6)故在代码中以注释的形式写出AF和RI而不能在 Javadoc文档中,防止被外部看到而破坏表示独立性 / 信息隐藏
(7)ADT类型的注意事项:
构造器和生产器在创建对象时要确保不变量为true
变值器和观察器在执 行时必须保持不变性
在每个return之前,用checkRep()检查不变量是否得到保持
考点包括以下几个方面:
-
ADT的定义和特性:
- ADT是什么?为什么它被称为抽象数据类型?
- ADT与数据结构之间的关系是什么?ADT与具体实现的数据结构有何区别和联系?
-
ADT的基本操作:
- ADT定义了哪些基本操作(如创建、销毁、插入、删除、查找等)?
- 这些操作在抽象层面上如何描述?它们的复杂度是多少?
-
ADT的实例:
- 常见的ADT有哪些实例?例如栈、队列、链表、树、图等。
- 每种ADT的特点和应用场景是什么?如何选择合适的ADT解决特定的问题?
-
ADT的设计与实现:
- 如何设计一个符合特定要求的ADT?
- ADT的实现可以采用哪些具体的数据结构来支持其定义的操作?
-
ADT的抽象性和封装性:
- ADT如何通过封装隐藏其内部实现细节?
- 如何保证ADT在实际使用中的安全性和有效性?
-
ADT的应用:
- ADT在软件工程中的实际应用和重要性。
- 如何利用ADT提高代码的模块化、可维护性和复用性?
12、OOP
(1)接口、抽象类、具体类
①接口(interface):
声明:使用“interface”关键字
方法:默认为“public abstract”可以包含默认方法“default”和静态方法(“static”)
一个类可以实现多个接口,使用 implements
关键字
②抽象类(abstract)->不能被实例化的类
声明:使用“abstract”关键字
方法:可以包含抽象方法和具体方法
Tigs:
抽象方法:只有方法签名,没有方法实现,子类必须重写(实现)这些抽象方法
使用 extends
关键字,一个类只能继承一个抽象类。
③具体类
声明:不需要任何的关键字
方法:可以包含具体方法
可以继承抽象类并实现接口。
(2)Inheritance:严格继承->子类只能添加新方法,无法重写超类中的方法
(3)Override覆盖/重写