Java中的equals方法

时间:2022-04-03 16:05:57

Java中语言规范要求equals方法具有以下特性:

1)自反性,对非空引用,x.equals(x)返回true

2)对称性,当且仅当x.equals(y)时y.equals(x)返回true

3)传递性,对于x,y,z,若x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)也返回true

4)非空引用x,x.equals(null)返回false

以上规则似乎合情合理,但就对称性而言,当参数不属于同一类时就要认真思考一下了。

当e.equals(m)返回true,e为Employee的对象,m为Manager的对象,Employee为超类,Manager为子类

但是当二者反过来调用时,对称性不允许这个方法调用,或者抛出异常。


以下提出两个观点:

1)如果子类拥有自己的相等概念,则对称性需求将强制采用getclass进行检查

2)如果超类决定相等概念,则使用instanceof进行检测,这样可以在不同子类之间比较


下面给出方法:

1)显示参数为otherobject,为待检测的变量

2)检测this是否属于引用同一个对象

if(this==otherobject) return true;

3)检测otherobject是否为null

if(otherobject==null) return false;

4)检测是否为同一个类

if(getclass()!=otherobject.getclass()) return false;

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

classname other=(classname) otherobject;

6)将需要比较的域开始比较

return field1==other.field1&&......;