equals方法详解

书写equals方法采用instanceof还是getclass:

  • 如果子类有自己的相等概念,则equals方法的对称性需求将强制采用getclass进行检测
  • 如果由超类决定相等的概念,就可以使用instanceof进行检测,这样可以在不同子类的对象之间进行相等的比较

编写equals方法的建议:

  • 显示参数命名为otherObject,稍后需要将它转换成other的变量
  • 检测this与otherObject是否引用同一个对象:if(this==otherObject) return true;这实际上是一个优化。
  • 检测otherObject是否为null,如果为null,返回false,这项检测是必要的。if(otherObject==null) return false;
  • 比较this和otherObject是否属于同一个类。如果equals方法在子类中的语义有所改变,就用getClass检测:if(getClass()!=otherObject.getClass()) return false;如果所有子类的equals语义相同,用instanceof检测:if(!(otherObject instanceof ClassName)) return false;
  • 将otherObject转换成相应的类类型变量: ClassName other = (ClassName) otherObject
  • 下面开始对每一个域进行比较,基本类型用==比较,引用类型用equals方法比较,
  • 如果子类重新定义equals方法,就要在其中调用super.equals(other),先要满足基本的父类相等,然后才去考虑子类的特殊部分
  • 对于数组类型的域,可以采用静态的Array.equals方法检测相应的数组元素是否相等

Objects.equals(Object a,Object b) 如果a和b都为null,返回true,只有一个为null,返回false,否则返回a.equals(b)

posted @ 2016-11-13 23:42  下雨天MJ  阅读(278)  评论(0)    收藏  举报