JAVA 解释一下equals重写

最好能大致解释一下这段代码
//if (null == o)
// return false;
//这一段是做什么用的?

// Car c = (Car) o;
// (Car) o 的Car为什么要用括号括起来

public boolean equals(Object o) {
    if (null == o)
        return false;
    Car c = (Car) o;
    return this.color.equalsIgnoreCase(c.color)
            && this.number.equalsIgnoreCase(c.number)
            && this.brand.equalsIgnoreCase(c.brand);
}

在java的集合框架中,有多个api依赖于equals&hashCode方法。其中我们比较常用到的就是Set&Map两个接口。
所以在自定义Override这两个方法时,需要同时Override。
这里面有具体的原则,你可以参考下effective java的相关章节。

public boolean equals(Object o) {
if(this == 0) //添加这句,代表两个引用变量指向同一个对象
return true;
if (null == o) //对象为空,直接返回false
return false;

Car c = (Car) o;  //这句话调用之前,需要确保O继承了该类,否则会报类转换异常,所以代码存在bug
return this.color.equalsIgnoreCase(c.color)  //这里就是比较具体的内容
        && this.number.equalsIgnoreCase(c.number)
        && this.brand.equalsIgnoreCase(c.brand);

}

 public boolean equals(Object o) {
    if (null == o)//对象没有new就返回
        return false;
    Car c = (Car) o;//不强转,object中没有color,number,brand这些属性
    return this.color.equalsIgnoreCase(c.color)
            && this.number.equalsIgnoreCase(c.number)
            && this.brand.equalsIgnoreCase(c.brand);
}

(1)如果让equals和null比,那么直接返回false。也就是任何对象和null比都是不相等。
(2)因为equals(Object o),参数是object,所以需要先强制类型转换。