对所有对象都通用的方法-----EffectiveJava

对所有对象都通用的方法

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;
}
11.覆盖equals时总要覆盖hashCode
12.始终要覆盖toString
13.谨慎覆盖clone
14.要考虑实现Comparable接口
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值