4,关于判断两个变量相等的问题

(1)最常用的是==和equals,==多用于比较基本变量,equals是Object中的方法,判断两个对象是否具有相同的引用。但是他的子类可以根据自身实际情况进行覆盖,如String类中,==用来比较两变量内存地址是否相同,equals比较两变量内容是否相同;但是在别的未覆盖equals方法的类中,即使两对象内容完全相同equals比较的结果仍然是返回false.对于equals只要知道在比较字符串内容时使用就行了。

(2)Java中对于equals方法要求所具有的特性:

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

     2)对称性:如果x.equals(y)返回true,那么y.equals(x)返回true

     3)传递性:x.equals(y)为true,y.equals(z)为true,则x.equals(z)为true

     4)一致性:如果x,y引用的对象没有发生变化,反复调用equals的返货结果应该相同

     5)对于任意非空引用x,x.equals(null)应该返回false

先给出完美的equals方法:(比较对象为otherObject)

     1)监测本类对象与otherObject是否引用同一对象(比起直接检测各个域要节约成本)

          if(this==otherObject) return true;

     2)检测otherObject是否为full

          if(otherObject==null) return false;

     3)比较this与otherObject是否为同一类:

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

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

          Classname other=(ClassName) otherObject

     5)比较所有需要进行比较的域:

          return field1==otherObject.field1&&field2==otherObject.field2&&.......

     6)在子类中定义equals方法时先调用super.equals(other).

注意:该方法声明时为:public boolean equals(Object otherObject)才能覆盖Object中的equals方法,而出于一般逻辑此时很可能将形参声明为本类类型public boolean equals(本类类型  otherObject),这时该方法是一个与Object equals方法完全无关系的方法,形成了重载。此时可以在语句前面用@Override进行标记,则编译器就会对未达到覆盖目的方法报错。

关于上述第三步,还有另一个方法可以实现:if(!(otherObject instanceof ClassName)) return false;这两个方法由于java对于equals方法的限制各有局限性,可根据以下建议来选择合适的方法:如果子类拥有自己的相等概念(相等要求的内容中包含子类特有的域),那么对称性要求采用getClass方法;如果相等概念由超类决定,那么使用instanceof进行检测。

你可能感兴趣的:(JAVA,java,对象,equals)