Java基础-Equals
0.Java语言规范:equals
为了看的快一些 以下 equals 简写成 == ,以下abc包括abd及abc的引用
- 自反性: a==a (a非空)
- 对称性: 如果ab, 那么ba
- 传递性: 如果 ab,bc,那么a==c
- 一致性: 如果a、b不发生变化 那么 a==b的判断结果也不发生变化
- 对于任意非空引用x,x.equals(null) 应该返回false。
完美解决方法
1.如果子类可以决定两个对象是否相等,用getClass去比较
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
ClassName other = (ClassName) obj;
用来决定是否两个对象是否相等,如下判断是 目标相等域 的相等判断。
return 基础类型feild == other.基础类型feild
&& 对象类型feild.equals(other.对象类型feild)
&& ....... ;
注意:如果子类想要重写equals,需要调用 super.equals(obj)
2.如果超类来决定两个对象是否相等,用instanceof去比较(instanceof兼容子类),并且添加final,使子类无法重写equals
if (this == obj) return true;
if (obj == null) return false;
if (!(obj instanceof Employee)) return false;
ClassName other = (ClassName) obj;
和上面一样,根据你想要相等的域 进行相等判断
return 基础类型feild == other.基础类型feild
&& 对象类型feild.equals(other.对象类型feild)
&& ....... ;
利用雇员和经理的例子可以解释改知识点:
经理 extends 雇员
第一种情况的例子:
经理和普通雇员不能相比较,两个经理比较,名字,职位等等都一样,只有分红不一样,那么就算两个对象不相同。普通雇员也是如此可以比较。
第二种情况的例子:
不管是经理还是普通雇员可以相互比较。只要是id不一样,就是两个不同的对象。
看Java核心(第十版) equals的总结。