快要考试了,根据所给提纲和上课所学边复习边罗列一下重难点吧。学得不好,如有疏漏欢迎指正!
一、ADT操作的四种类型
ADT:抽象数据类型,强调“作用于数据上的操作”,程序员和用户均无需关心数据如何具体存储,只需设计/使用操作即可。即ADT是由操作定义的,与内部如何实现无关。
四种类型:
(1)Creator:创建该类型的新对象,可作为构造函数来实现,静态实现的通常称为工厂方法
(2)Producer:从该类型的旧对象创建新对象
(3)Observer:获取抽象类型对象并返回不同类型的对象
(4)Mutator:改变对象,通常为void,此时必须被调用,有时返回boolean。(immutable一定不含)
Example:
二、表示独立性
ADT内部的变化不应影响外部spec和客户端
三、表示泄露
ADT的实现可见、可被客户端修改
四、不变量、表示不变量RI
(1)不变量:程序的属性,每个抽象数据类型都应保有自己的不变量,这些不变量被构造函数创建后保持不变,其正确性不依赖于其他模块,由公共方法调用维护,方法执行期间可能暂时失效。
(2)表示不变量RI:RI将表示值映射为Boolean,当该值能被映射到AF中时为真
五、表示空间、抽象空间、AF
开发者关注表示空间R、用户关注抽象空间A
二者联系:
(1)满射:所有A都有对应。
(2)未必单射:A可以对应多R,但R不能对应多A。(可以,但最好单射)
(3)未必双射:R无A对应。
AF:抽象函数R --> A,即R在A中的解
六、以注释的形式撰写AF、RI
不同的内部表示,需要设计不同的AF和RI
即使是同样的R、同样的RI,也 可能有不同的AF,即“解释不同”
设计ADT:(1) 选择R和A;
(2) RI --- 合法的表示值;
(3) 如何解释合法的表示值 ---映射AF
做出具体的解释:每个rep value如何映射到abstract value
Example:
七、接口、抽象类、具体类
接口:确定ADT归约
类:实现ADT
注:
(1)接口中的每个方法在所有类中都要实现
(2)通过default方法,在接口中统一实现某些功能,无需在各个类中重复实现它
(3)以增量式的为接口增加额外的功能而不破坏已实现的类
抽象类:至少包含一个抽象方法的类,即在父类中未给出具体实现
具体类:不包含抽象方法
八、继承、override
严格继承:子类只能添加新的方法,无法重写父类中的方法
override:完全同样的signature,调用哪个方法在运行时决定
重写的时候不能改变原方法的本意。
九、多态、overload
三种多态类型:特殊多态、参数化多态、子类/包含多态
Example:
overload:多个方法具有同样的名字,但有不同的参数列表或返回值类型
意义:方便用户调用,用户可用不同的参数列表调用同样的函数
注:
(1)参数列表必须不同
(2)返回值类型可以不同
(3)public等属性可以不同
(4)异常可以不同
(5)可以在同一个类内重载,也可以在不同子类中重载
对比:
重载看类型,重写看对象
十、泛型
泛型:数据类型和函数根据待指定的类型编写,在需要时作为参数提供的特定类型实例化
四种使用方式:泛型类声明、泛型接口声明、泛型方法声明、泛型构造函数
泛型类:声明了一个或多个类型变量的类,类型变量用<>括起
通配符:通常用 * 或 ? 表示,如List<?> 或 List<? extends Animal>
只能在使用泛型的时候出现,不能在定义中出现
不能存在泛型数组
Example:
十一、等价性equals()和==
==:引用等价性,对于基本数据类型的判断
equals:对象等价性,在自定义ADT时需要重写
Example:
十二、equals的自反、传递、对称
传递常难以满足
其他性质:不可改、不能与空作比较
十三、hashCode()
(1)等价的对象必须有相同的hashCode
(2)不相等的对象也可以映射为同样的hashCode,但性能会变差
(3)重写equals就最好要重写hashCode
十四、不可变对象的引用等价性、对象等价性
immutable类型对象在程序执行任何时间都相等,故只考虑引用/对象等价性
十五、可变对象的观察等价性、行为等价性
观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致(一个点)
行为等价性:调用任何对象的方法都展示出一样的结果(一条时间线)
对于可变类型,实现行为等价性即可,无需重写equals、hashCode函数
Negative example:
若某个mutable的对象包含在set集合类中,当其发生改变后,集合类的行为不确定。