重写equlas()方法的规则

来源:互联网 发布:图像数据预处理方法 编辑:程序博客网 时间:2024/05/22 14:13

equals方法实现了等价关系,一般要满足下列条件


自反性(reflexive)


对称性(symmetric)


传递性(transitive)


一致性(consistent)


对于任意的非空引用值x,x.equals(null)一定返回false.


要实现高质量equals方法,可如下做:

使用==操作符检查“实参是否为指向对象的一个引用” ,如果是,返回true;


使用instanceof操作符检查“实参是否为正确的类型”,

如果不是,返回false;


把实参转换到正确的类型


对于该类中每一个"关键(significant)"域,检查实参中的域与当前对象中对应的域值是否匹配。

如果所有的测试都成功,则返回true;


例如:

class Programer{
     int number;
     public Programer(int n){
          number=n;
     }
     //必须覆盖hashCode()方法  
     public int hashCode(){
          return number;
     }
     public boolean equals(Object obj){
        if(this==obj)) return true;//比较的是两个对象的引用(references)是否相等
        if(obj==null) return false;//检查 obj)是否为空
       if(!(obj instanceof(Programer))) return false;
        return (number==((Programer)obj).number);
     }
}

当编写完成了equals方法之后,应该满足:它是否是对称的、传递的、一致的?
  
注意:


1)当你改写equals的时候,总是要改写hasCode方法

2)不要将equals声明中的Object对象替换为其它的类型

当你的equals不能正常工作时,看看是不是犯了下述例子的错误。

public boolean equals(MyClass o){

...

}
这种方式并不是覆盖object类的equals方法

原创粉丝点击