今天使用快捷键去生成equals方法时,没有注意这里的选项
我用的最下面 Java7+的模板,生成的equals方法如下:
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass())
if (!(o instanceof Point)) return false;
Point point = (Point) o;
return x == point.x && y == point.y;
注意那里的 getclass方法,就是因为这个模板,导致我去比较 父子类的时候,发生了错误
输出的是 false;(父子类),同类还是true
于是我查阅资料,发现别的模板生成的equals方法是这样的
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof father)) return false;
father father = (father) o;
if (name != null ? !name.equals(father.name) : father.name != null) return false;
return sex != null ? sex.equals(father.sex) : father.sex == null;
}
用的是 instanceof 方法,这回再去比较 父子类,就满足对称性了。
附加:重写equals方法的 四大特性
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回true。
(提醒:父类和子类,属性相同时需要注意下这个规则)
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改对于任何非空引用值 x,x.equals(null) 都应返回 false