Chapter 3 Abstract Data Type(ADT) and Objective-Oriented Programming(OOP)
一、基本数据类型、对象数据类型
基本数据类型 | 对象数据类型 |
int,long,byte,short,char,float,double,boolean | Class,interface,arrays,enums,annotatons |
只有值,没有id(与其他值无法区分) | 既有值,也有id |
不可变 | 部分可变 |
存在栈,被使用是存在 | 在堆中分配内存 |
不能表达统一 | 和范型统一 |
廉价 | 代价大 |
二、静态类型检查、动态类型检查
静态类型检查>>动态>>无检查
静态类型检查 | 动态类型检查 |
编译阶段检查,提高程序健壮性、正确性 | 运行阶段检查 |
语法/类名/函数名/参数数量/参数类型/返回值类型 错误 | 非法 参数值/返回值,越界,空指针 |
关于“类型”的检查,不考虑“值” | 关于“值”的检查 |
三、Mutable/Immutable
1.keyword final :静态检查不允许final变量无法确定是否可变,尽量使用final变量作为方法的输入参数、作为局部变量
-final类无法派生子类
-final变量无法改变值/引用
-final方法无法被子类重写
2.Mutable/Immutable
不变对象 | 可变对象 |
一旦被创建,始终值低昂同一个值/引用 | 拥有方法可以修改自己的值/引用 |
-更安全 -因防御式拷贝而效率 | -避免因频繁修改产生的大量临时拷贝(需要垃圾回收) -最小化拷贝以提高效率toString()指给String -获得更好性能 -多模块间共享数据 |
四、值、引用的改变
1.改变变量(variable)&改变变量的值(value)
-改变variable:将该变量指向另一个值的存储空间
-改变value:将该变量当前指向的值的存储空间写入新的值
五、防御式拷贝
-通过防御式拷贝,给client返回一个全新的对象
-安全的使用可变类型:局部变量,不涉及共享;只有一个引用
六、Snapshot diagram
-快照图:用于描述程序运行时的内部状态
-基本类型的值
-对象类型的值
-不可变对象
-可变对象
-不可变引用(final)
七、Specification、前置/后置条件
前置条件:requires,@param
后置条件:effects,@return,@throws
八、行为等价性
规约相同
九、规约的强度
前置变弱,后置变强
更少的implementations可以满足,更多的client可以使用
自由度低,面积小
十、ADT操作的四种类型
1.构造器(creators)
可能实现为构造函数或静态函数Array.list(),工厂方法
Integer.valueOf():num->string->Integer
2.生产器(producers)
从旧的对象变量生产一个新的对象变量String.concat()
Collections.unmodifiableList()
3.观察器(observers)
返回值为其他类型size()
Set.contains()
4.变值器(mutators)
改变对象属性的方法,通常返回void,add()
BufferedReader.readline()
List.addAll()
十一、表示独立性
client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不影响外部spec和客户端
十二、表示泄露
一旦泄露,ADT内部表示可能会在程序的任何位置发生改变(不限于ADT内部),从而无法确保ADT的不变量是否能保持为true。
十三、不变量、表示不变量RI
不变量:在任何时候总是true(构造器、生产器创建对象时;变值器和观察期执行时;没有表示泄露)
由ADT来负责其不变量,与client端的任何行为都无关
十四、表示空间、抽象空间、AF
-表示空间:表示的值的集合
-抽象空间:抽象值生成的空间,client看到和使用的值
-AF:R和A之间映射关系的函数(必须是满射,未必单射,未必双射)
即使是同样的R、RI,也可能有不同AF,即“解释不通”
十五、以注释形式撰写AF、RI
-document of AF: ADT的规约里只能用client可见的内容来撰写,包括参数、返回、异常等,值只能属于A
不能谈及任何内部表示的细节,以及R中任何值
AF和RI的注释不能出现在Javadoc中
-RI:R -> boolean
某个具体“表示”是否合法
所有表示值的一个子集,包含来所有合法值
一个条件,描述什么是合法的值
十六、接口、抽象类、具体类
-Interface : 和class定义实现ADT;接口间可以继承;一个类可以实现多个接口;一个接口可以有多种实现
-抽象类:至少有一个abstract方法
十七、继承、override
-继承:extends
-重写:重新改写方法
十八、多态、overload
-
十九、范型
二十、等价性equals()和==
二十一、equals()自反、传递、对称性
二十二、