在java中覆盖 equals()

起因

这周软件构造实验中第三题需要判断自建类的相等性.

例如如下代码

class Person{

String name;

public Person(String name){

this.name = name;

}

}

Person aperson = new Person("a")

Person bperson = new Person("a")

我们希望的结果是aperson 等于 bperson.

解决方法

1. 使用 ==

java中 a == b 判断a 和 b 是否引用同一个object, 所以aperson == bperson会返回false, 这种方法不行

2. 覆盖euqals()

因为java中的所有class 都直接或间接地继承自 Object 类, 而Object类有一些基本的方法如 equals(), toString()等等.....我们就可以覆盖其中的equals方法, 然后调用aperson.equals(bperson)来判断两者是否相等.

我的第一次实现如下

class Person{

String name;

public Person(String name){

this.name = name;

}

@Override

public boolean equals(Object o){

return this.name == o.name;

}

}

但是第8行return this.name == o.name; 处报错了 name can't be resolved or not a field

于是我又换了种写法:

class Person{

String name;

public Person(String name){

this.name = name;

}

@Override

public boolean equals(Person o){

return this.name == o.name;

}

}

然而这次第七行public boolean equals(Person o)处又报错了The method equals(Person) of type Person must override or implement a supertype method

这两个错误的原理我不是很清楚, 等之后我弄清楚之后会更新上来

于是我只好再改个方法如下

class Person{

String name;

public Person(String name){

this.name = name;

}

@Override

public boolean equals(Object o){

return this.name == o;

}

}

这次倒是没有报错了, 不过调用的时候非常不美观, 得写成aperson.equals(bperson.name)

看着十分不舒服, 我又上网搜索覆盖equals的相关博客, 找到了这个博客, 并根据其改写了最终版本如下:

class Person{

String name;

public Person(String name){

this.name = name;

}

@Override

public boolean equals(Object o) {

if(this == o) {

return true;

}

if(!(o instanceof Person)) {

return false;

}

Person person = (Person) o;

return this.name.equals(person.name);

}

}

终于,aperson.equals(bperson)可以返回true了

更新

第一次失败的原因

Object类没有name域

[参考java核心技术5.1.1-5.1.2(第十版)]

第二次失败的原因

Object 类中的equals方法的参数类型是Object, 只有函数签名相同的才能覆盖, 这儿写成public boolean equals(Person o)相当于自己实现了一个equals方法, 和前面的@override矛盾.

[参考java核心技术5.1.1-5.1.2(第十版)]

改进

当 b 为 a 的子类对象的时候, b isinstanceof a会返回true, 某些情况下这样不利于equals要求的对称性, 这种情况下可以考虑使用getClass()方法

附上java核心技术中给的编写完美地equals方法的建议:

1 ) 显式参数命名为 otherObject, 稍后需要将它转换成另一个叫做 other 的变量。

2 ) 检测 this 与 otherObject 是否引用同一个对象:

if (this = otherObject) return true;

这条语句只是一个优化。实际上,这是一种经常采用的形式。因为计算这个等式要比一个一个地比较类中的域所付出的代价小得多。

3 ) 检测 otherObject 是否为 null, 如 果 为 null, 返 回 false。这项检测是很必要的.

if (otherObject = null) return false;

4 ) 比较 this 与 otherObject 是否属于同一个类。如果 equals 的语义在每个子类中有所改

变,就使用 getClass 检测:

if (getClass() != otherObject.getCIassO) return false;

如果所有的子类都拥有统一的语义,就使用 instanceof 检测:

if (!(otherObject instanceof ClassName)) return false;

5 ) 将 otherObject 转换为相应的类类型变量:

ClassName other = (ClassName) otherObject

6 ) 现在开始对所有需要比较的域进行比较了。使用= 比较基本类型域,使用 equals 比较对象域 。如果所有的域都匹配, 就返回 true; 否 则 返 回 false。

return field == other.field && Objects.equa1s(fie1d2, other.field2)

如果在子类中重新定义 equals, 就要在其中包含调用 super.equals(other)

java equals覆盖_java 中覆盖equals() 方法相关推荐

  1. java和equals区别_JAVA中==与equals的区别

    equals如果没有被重写的话,和==的作用是一样的,都是判断两个对象引用是否指向同一个地址.一般重写了equals()方法就表示比较它们"实际意义上相等",比较的是内容,而不是引 ...

  2. java compareto 中文_java中的compareto方法的详细介绍

    一.java中的compareto方法 1.返回参与比较的前后两个字符串的asc码的差值,如果两个字符串首字母不同,则该方法返回首字母的asc码的差值 String a1 = "a" ...

  3. java getbytes 长度_JAVA中的getBytes()方法

    在Java中,String的getBytes()方法是得到一个操作系统默认的编码格式的字节数组.这个表示在不同情况下,返回的东西不一样! String.getBytes(String decode)方 ...

  4. java定义常量_JAVA中定义常量方法

    JAVA中定义常量方法 (2013-01-28 14:30:19) 标签: it 一.常量定义的基本注意事项. 在Java语言中,主要是利用final关键字(在Java类中灵活使用Static关键字) ...

  5. java finalize 作用_java中的finalize方法有什么作用

    java中的finalize方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法. finalize()方法是Object类中提供的一个方 ...

  6. java arrays.aslist()_Java中Arrays.asList()方法详解及实例

    Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...

  7. java字符截取_java中截取字符串方法

    Java 简介 substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串.该子字符串始于指定索引处的字符,一直 ...

  8. java nanotime 重复_Java中System.nanoTime方法能作为一个唯一字符串来使用吗

    展开全部 一般使用 UUID 类来生成唯一的字符串e68a84e8a2ad62616964757a686964616f31333361313365package test; import java.u ...

  9. java执行jar中的main_浅谈java 执行jar包中的main方法

    浅谈java 执行jar包中的main方法 通过 OneJar 或 Maven 打包后 jar 文件,用命令: java -jar ****.jar 执行后总是运行指定的主方法,如果 jar 中有多个 ...

最新文章

  1. java的知识点运用_Java--知识点运用
  2. [Sdoi2008]沙拉公主的困惑
  3. 尘锋2021产品发布会圆满落幕,双向赋能引领行业发展
  4. 平移不变性:Translation Invariance 与 平移同变性:Translation equivariance
  5. 响应式系统reactive system初探
  6. Tomcat version 7.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 and 6 Web
  7. UVA1493 - Draw a Mess(并查集)
  8. 由汉诺塔引起的对递归的思考
  9. ENVI5.3.1使用Landsat 8影像进行主成分分析实例操作
  10. nlogn 求最长上升子序列 LIS
  11. 如何使用Python3连接MySQL
  12. 计算机辅助设计autocad2005(建筑)四级考试,计算机辅助设计(AutoCAD平台)
  13. 微信小程序获取二维码报错:{“errcode“:47001,“errmsg“:“data format error hint:“}
  14. PPT可以直接剪裁视频
  15. php实现股票日线数据转换为周线月线,通达信引用月线数据,如何在日线里调用周线和月线函数?...
  16. url 里面 等号_【Python成长之路】从零学爬虫给微信公众号阅读量作个弊:刷阅读量...
  17. Win10如何用微软账户自动登录电脑
  18. 手把手安装Windows11虚拟机
  19. No.1_NABCD模型分析
  20. 手动搭建PHP开发环境

热门文章

  1. 记我的第一个springboot项目,Roomstore寝室小卖部系统
  2. 【原创总结】Tomcat进程为什么起不来?
  3. 心动的本质是什么_回归生活的本质,为生活心动
  4. 梯度消失和梯度爆炸_出现梯度消失与梯度爆炸的原因以及解决方案
  5. 1147. 西佳佳偶像天团1
  6. 看“废物”如何重生,看“闲鱼”如何翻身
  7. 信息管理系统第三部分作业
  8. 个人支付方案(免签约)-支付宝当面付 附带源码
  9. Keystone组件详解
  10. python 贝叶斯分类器sklearn_使用sklearn自带的贝叶斯分类器进行文本分类和参数调优...