目录
前言
继续复习软件构造
一、ADT相关介绍
1、ADT的基本概念
ADT特性:表示泄露,表示不变量,抽象函数
抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计/使用操作即可。
可变数据类型的对象:提供了可以改变内部数据的值的操作
不可变数据类型的对象:其操作不改变内部数值,而是创建了一个新的对象
构造器creator:新建一个此类型的对象可能实现为构造函数或静态函数
生产器producer:从此类型的旧的object中新建一个新的object
观察器observer:用此抽象类的一个object返回一个其它类型的object
变值器mutator:改变对象属性的方法通常返回为void(也可能返回非空类型),改变对象某些内部状态
2.如何设计好的ADT:
设计一个好的需要以下几个方面
1)规约设计简洁、一致
2)支持client对数据的所有操作、而且用操作满足client需要的难度要低
3)要么抽象、要么具体
3.RI、AF、rep
RI:表示空间R的一个子集,即”合法“的那些表示值,只有这些值才可以通过AF映射到空间A中。
AF:解释每个合法的Rep如何映射到抽象空间中的值。
表示独立性:client使用ADT时无需考虑其内部如何实现,ADT内部表示的变化不应影响外部spec和客户端。
RI的定义类型:采用private final的形式进行定义
由此可知当我们需要返回某个可变类型的参数时,不要直接返回,而是进行防御式拷贝。
ADT开发者关注表示空间R,client关注抽象空间A
AF:满射、未必单射、未必双射(R中的部分值并非合法,在A中无映射值)
选择某种特定的表示方式R,进而指定某个子集是“合法”的(Rl),并为该子集中的每个值做出“解释”(AF)——即如何映射到抽象空间中的值。
即使同样的R、RI,也可能有不同的AF,即解释不同。
4.设计一个ADT的步骤
1)选择R、A
2)确定RI---合法的表示值
3)解释合法的表示值---映射AF
5.checkRep()
checkRep():随时检查RI是否满足,所有可能改变rep的方法内部都要检查,尽管观察器可以不用,但是为了防止万一,建议也要检查。
6.其他
对immutable的ADT来说,它在A空间的abstract value应是不变的。但其内部表示的R空间中的取值则可以是变化的。
ADT的规约里只能使用client可见的内容来撰写,包括参数、返回值、异常等。如果规约里 需要提及“值”,只能使用A空间中的“值”。ADT里不能谈及任何内部表示的细节。在代码中以注释的形式写出AF和RI而不能在Javadoc文档中,防止被外部看到而破坏表示独立性/信息隐藏。用ADT不变量取代复杂的 Precondition,相当于将复杂的precondition封装到了ADT内部。
二.final关键字
final表示最终的意思,它修饰的类是不能被继承的;final修饰的方法能被继承(Math类里就有),但是不能够被重写。其实关系并不复杂,你只需要记住这样一句话:final可用于声明属性、方法和类,分别表示属性不可变,方法不可重写,类不可继承。当然final修饰的方法是可以被重载的。
三.方法的重写与重载
关于方法重写的一些特性(静态检查):
- 发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
- 子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
- 子类重写父类方法的返回值类型不能大于父类方法的返回值类型,即是说子类方法的返回值必须和父类方法的返回值相同或是其子类。
- 构造方法不能被重写。
- 如果不能继承一个类,则不能重写该类的方法。
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
- 父类的成员方法只能被它的子类重写。
- 声明为 final 的方法不能被重写。
- 声明为 static 的方法不能被重写,但是能够被再次声明。
关于方法重载的一些特性(动态检查):
- 被重载的方法必须改变参数列表(参数个数或类型或者顺序不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
总结
本文简要介绍了ADT的相关知识,方法的重载、重写以及final关键字