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&&......;