对所有对象都通用的方法
Object是一个具体类
equals/hashCode/toString/clone/finalize都有明确的通用约定,因为是被设计成要覆盖掉的。
finalize 方法见上一篇文章
这里还会讨论Comparable, compareTo
10.覆盖equals时遵守通用约定
- 如果没有覆盖,就默认每个类的实例都是不同的
- 如果超类已经覆盖了equals方法,就不用再,Set、List、Map继承了AbstractSet。。。
- 类私有的,equals永远不会被调用的情况下,就不用覆盖
@Override public boolean equals(Object o){
throw new AssertionError();
}
- 如果是值类,就需要覆盖
- equals方法实现了等价关系,自反性,传递性,对称性,一致性,x.equals(null) == false
CaseInsensitiveString cis = new CaseInsensitivString("Polish");
String s = "poslish"
cis.equals(s) != s.equals(cis)
@Override public boolean equals(Object o){
return o instanceof CaseInsensitiveString &&
((CaseInsensitiveString) o).s.equalsIngnoreCase(s);
}
equals可能会导致无限递归,然后产生SOE
使用getClass代替instanceof
@Override public boolean equals(Object o){
if ( o == null || o.getClass() != getClass())
return false;
Point p = (Point) o;
return p.x == x && p.y == y;
}