Object
Object类是Java中所有类(不包括基本数据类型)的超类,在Java中每个类都是由它扩展而来的。如果没有明确指出超类,Object就被
认为是这个类的超类,所以不需要这样显式声明:
1 | public Animal extends Object{ |
所有的数组类型,不管是对象数组还是基本类型的数组都扩展Object类
Object中的常用方法介绍
equals
Object中的equals方法用来检测一个对象是否等于另一个对象。在Object类中
这个方法将判断两个对象是否具有相同的引用。不过一般情况下,这种方式没有用。比如在
现实中我们通常通过比较id的方式来判断员工是否是同一个人。所以,我们都要重写
Object的equals方法。例如:
1 | public class Employee { |
equals方法应该具有的特性:
- 自反性:对于任何非空引用x,x.equals(x)应该返回true
- 对称性:对于任何引用x和y,当x.equals(y)返回true时,y.equals(x)也应该返回true
- 传递性:对于任何引用x,y,z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也应该返回true
- 一致性:如果x和y的引用没有发生变化,反复调用x.equals(y)应该返回相同的值
- 对于任何非空引用x,x.equals(null)应该返回false
处理继承问题
使用instanceof,例如:
1 | if(!(other instanceof Animal))return false; |
不过考虑一下这样的情况:
A是B的父类,如果B中重写了equals方法,如下
1 | if(!(other instanceof B))return false; |
由于:
1 | A instanceof B 返回 false |
所以:
1 | B.equals(A);返回 false |
不符合对称性。要使符合对称性,就必须让父类的equals方法为final.
使用getClass,不检测继承关系。getClass方法只有当两个引用来自同一类时,才会返回true。例如:
1 | B.getClass() == A.getClass() 返回false |
编写equals()方法的建议:
- 显式参数命名为
otherObject - 检测
this与otherObject是否引用同一个对象。例如:if(this == otherObject)return true;,使用这个就行优化,由于
计算这个等式要比一个一个比较类中的域所付出的代价要小得多。 - 检测
otherObject是否为null.例如if(otherObject == null) return false; - 比较
this与otherObject是否属于同一个类:
如果equals被子类覆盖,那么应该使用getClass();
如果所有的子类都拥有统一的语义,就使用instanceof. - 将
otherObject转化为相应类类型的变量ClassName other = (ClassName)otherObject - 对所有需要比较的域就行比较。基本类型使用
==,对象域使用equals.
hashCode
散列码(hash code)是由对象导出的一个整数值。散列码是没有规律的。如果x和y是两个不同的
对象,x.hashCode()与y.hashCode基本不会相同。
hashCode()没被覆写时,默认是返回对象的储存地址。
重写hashCode()方法:
1 | public class Employee { |
注意:equals与hashCode的定义必须一致:如果x.equals(y)返回true那么x.hashCode()就必须等于y.hashCode()
toString
toString方法用来返回对象值的字符串.
Objects
Objects是一个工具类,它提供了很多实用方法,例如:
1 | int compare(T a, T b, Comparator c) |