前言Object类是Java中所有类的始祖 , 在Java中每个类都扩展了Object 。如果没有明确地指出超类 , Object就被认为是这个类的超类 。由于在Java中每个类都是由Object类扩展而来的 , 所以熟悉这个类提供的所有服务十分重要 。
equals方法equals
方法用于检测一个对象是否等于另外一个对象 。在Object类中 , equals
方法比较的是两个对象的地址值 , 地址值相同返回true
, 否则返回false
, 以下是其源码:
public boolean equals(Object obj) {return (this == obj);}
==运算符的使用:对于基本数据类型 , 其比较的是对象的数值;对于引用数据类型 , 其比较的是对象的地址值 。
重写equals方法在Object类中 , equals方法比较的是两个对象的地址值 , 然而这样的比较意义不大 , 我们更希望根据两个对象的属性值是否相同来判断这两个对象是否“相等” , 因此我们在自己创建对象时需要重写equals方法 , 以下是自己创建的Employee
类中的具体重写代码:
public class Employee {private String name;private double salary;private LocalDate hireDay;// 重写equals方法 , 传入Object对象public boolean equals(Object otherObject) {// 若参与比较的两个对象是同一个对象(地址值相同) , 直接返回true , 只是为了提高代码执行效率if (this == otherObject) {return true;}// 判断非空if (otherObject == null) {return false;}// 判断2个对象是否属与同一个类if (getClass() != otherObject.getClass()) {return false;}// 将Object类型强转成Employee类Employee other = (Employee) otherObject;// 返回对象是否相等的结果return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);}}
objects.equals()在重写equals方法的最后使用了Objects.equals()
函数 , Objects类是JDK7之后添加的一个工具类 , 它提供了一些方法来操作对象 , 它由一些静态的实用方法组成 , 这些方法是空指针安全的 , 其中Objects.equals()
就是为了防止Object.equals()
中容易出现空指针异常的现象源码如下:
public static boolean equals(Object a, Object b) {return (a == b) || (a != null && a.equals(b));}
编写equals方法的建议
- 显示参数命名为
otherObject
, 稍后需要将它强制转换成另一个名为other的变量 - 检测
this
与otherObject
是否相等:
if (this == otherObject) return true;
??这条语句只是一个优化 。实际上 , 这是一种经常采用的形式 。因为检查身份要比逐个比较字段开销小 。- 检测
otherObject
是否为null , 如果为null , 返回false 。这项检测是很有必要的 。
if (this == otherObject) return false;
- 比较this与otherObject的类 。如果equals的语义可以在子类中改变 , 就使用
getClass
检测
if (getClass() != otherObject.getClass()) return false;
??如果所有的子类都有相同的相等性语义 , 可以使用instanceof
检测if (!(otherObject instanceof ClassName)) return false;
- 将otherObject强制转换为相应类类型的变量:
ClassName other = (ClassName) otherObject
- 根据相等性概念的要求来比较字段 。使用
==
比较基本类型字段 , 使用Objects.equals
比较对象字段 。如果所有的字段都匹配 , 就返回true;否则返回false 。如果子类中重新定义equals , 就要在其中包含一个经验总结扩展阅读
- 亲朋打鱼有什么技巧
- 湖南花鼓调有多少种
- 塑料材料的分类有哪些种类
- 中国是什么类型的国防
- 破坏大自然给人类造成的危害
- 面向制造企业普适性ERP、MES类产品为什么那么难找?
- C#/VB.NET 读取条码类型及条码在图片中的坐标位置
- 神奇宝贝的种类以及分辨
- 主营业务成本属于什么类科目
- 求穿越农家女一类的完结小说