哈工大软件构造复习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是一个浅拷贝:将内存地址赋给了新变量

 

 

 

 

 

 

 

.

 

posted @   feeling123  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示