哈工大软件构造复习4(8)
8 Equality in ADT and OOP
ADT和OOP中的等价性
抽象函数AF:内部表示->抽象表示,我们基于抽象函数AF来定义ADT的等价操作,
从数学角度上来说,”绝对相等“存在
相等关系需满足:自反,对称和传递,是一种等价关系
站在外部观察者角度:对两个对象调用任何相同的操作,都会得到相同的结果,则认为这两个对象是等价的。
==vs.equals()
其中==表示引用等价性,equals()是对象等价性
如果用==,是在判断两个对象身份标识 ID是否相等(指向内存里的同一段空间)
我们应该总是使用.equal来判断相等
缺省是在判断引用等价性,这不是我们期望看到的,我们需要重写
Java 编译器使用参数的编译时类型在重载操作之间进行选择。(静态类型检查)
检验equals是否正确:
1)每一个对象都等于它本身(自反)
2)如果a.equals(b) 那么 b.equals(a)(对称)
3)if a.equals(b) and b.equals(c), then a.equals(c) (传递)
用instanceof操作可以判断对象是否是一种特殊的类型(用instanceof是一种动态类型检查)(不能在父类中用instanceof判断子类类型)
1)等价的对象必须拥有相同的hashCode;不相等的对象也可以映射为同样的hashCode,但是会影响性能
2)重写equals方法必须要重写hashCode方法(除非能保证你的ADT不会被放入到Hash类型的集合中)
观察等价性:在不改变状态的情况下,两个mutable对象是否看起来一致
行为等价性:调用对象的任何方法都展示出相同的结果
对mutable类型,实现行为等价性即可。也就是说只有指向同样内存空间的objects,才是相等的,所以对mutable类型来说,无需重写这两个函数,直接调用Object的两个方法即可。
Collections 使用的是观察等价性,但是其他的mutable类(如StringBuilder)使用的是行为等价性
LIST,DATA,观察等价性

clone(a):创建并返回一个a的复制
满足:分配的内存和源对象(即调用clone方法的对象)相同,然后再使用源对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

clone是一个浅拷贝:将内存地址赋给了新变量
.

浙公网安备 33010602011771号