ADT等价性
ADT的等价性是对于客户端角度而言的,其等价性可以从以下体现
(1)通过AF:AF若映射到同样的结果,则等价
(2)通过关系:等价关系是自反,对称,传递的
(3)通过观察行为:站在外部观察者的角度,调用观察来判定其等价
==和equal
(1)==是引用等价性,意为两个引用是否指向同一个对象,即同一个内存地址
(2)equals(是对象等价性,在自定义ADT时,需要对其进行重写,来保证判断其
等价的条件。 == 对基本数据类型,使用==判定相等 , 对对象类型,使用equals()
举例:
注意Stringbuilder的equals等同于==,所以c不对
重写:
字面意义理解重写就是 重新写一遍的意思。这个操作发生在继承期间,在运行时存在继承关系的类型对象可以互相转换。子类型也可以重写(override)父类的方法,替换为自己的实现代码。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
重载:
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同重载也可以发生在父类与子类之间(子类重载父类的方法)
接口与类:
我们可以理解为接口是对动作的抽象,抽象类是对根源的抽象。所以,在高级语言上,一个类只能继承一个类(抽象类)(就好比人不能是其他动物),但是可以实现多个接口(运动接口,睡觉借口等动作)。
接口相当于规定了ADT所需的未实现的操作(方法),这是用户所关注的。
类真正地在代码层面实现了接口规定的ADT操作,并且实现了ADT内部的数据存储
ADT的几种操作:
构造器creator,输入一些其它类型的对象,创建一个该ADT对象。例如创建一个新集合new()或者现实中的构造函数。
生产器producer,通过该ADT的旧对象,创建一个该ADT的新对象,例如计算当前集合与S的交集的方法ins(S)。
观察器observer,通过该ADT本身的数据以及传入参数,计算得到其它类型的值。例如检查集合里是否有x的方法find(x)。
变值器mutator,作出“修改ADT内部数据”的行为,是可变对象与不可变对象的本质区别!例如将x加入集合并返回加入x后的集合大小的方法add(x)。