ADT和OOP中的“等价性”

本文探讨了ADT(抽象数据类型)的等价性概念,它基于对象对外部操作的响应一致性。==在Java中用于引用等价,而equals()用于对象内容等价。当自定义ADT时,通常需要重写equals()方法以判断内容等价。重写时需注意参数保持为Object类型,并进行类型检查、null值判断及具体内容的对比。正确实现equals()有助于确保对象比较的正确性。
摘要由CSDN通过智能技术生成

在很多时候,我们需要判断两个对象是否“相等”,那么何为ADT的等价性?==和equals()有何区别?如何为自定义ADT正确实现equals()?接下来,我们就来分析一下这些问题。

等价关系:

由集合论知识,等价关系满足自反、对称、传递。ADT是对数据的抽象,体现为一组对数据的操作;抽象函数AF是从内部表示到外部抽象表示的映射。ADT的等价操作就要基于抽象函数AF,AF映射到同样的结果,则等价;更通俗的说,client观察者对两个对象调用任何相同的操作,都会得到相同结果,则这两个对象等价!

== vs equals():

Java中==是引用等价性,两个对象只有内存地址(身份标识ID)一样才等价,对于基本数据类型,使用==判定相等;

equals()是对象等价性,两个对象内容一样即等价,对于对象数据类型,使用equals()判定相等。

如下图,python二者比较与其他语言正相反:

如何为自定义ADT正确实现equals():

在“祖宗”Object中实现的缺省equals()判断的是引用等价性,如下图:

这通常不是我们所期望的,很多时候我们都是希望判断内容是否等价,因此在自定义ADT中通常需要重写equal(),注意是重写不是重载!!!(重写与重载的区别分析可见上篇博客)因此参数列表不能改变,参数仍为Object类型,这里后续就需要进行强制转换啦~

举个栗子:

 重写equals()方法,参数列表不变。先进行类型比较和null值判定,instanceof用来测试左边对象是否是右边的类的实例,即是否是右边类/子类所创建的对象,如果不是类型错误,返回false;接下来进行强制转换,对应上文;最后根据AF来选取Observer方法,对应上文,判断是否等价!

 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值