所有对象的通用方法

目录

通用方法

Object类在Java中是所有类的父类, Object类中的非final修饰的方法可以被子类覆盖(override). 当我们在自己设计类,如果需要覆盖这些Object类中的方法, 就需要遵守通用约定(general contract).
这一章节就是介绍覆盖这些方法时的通用约定, 自己在设计编写一个类的时候如何去覆盖这些Object类中的方法.

1.equals覆盖通用约定

Object类中的默认的equals方法比较的是内存的地址,使用==判断请添加图片描述
当类需要比较值相等而不是引用是否相等的时候,需要覆盖equals方法
覆盖equals时需要遵守的通用约定:
1.自反性(reflexive): 任何非null的引用值x, x.equals(x)必须返回true
2.对称性(symmetric): 对于任何非null的引用值x和y, y.equals(x)返回true时,x.equals(y)也必须返回true
3.传递性(transitive): 任何非null的引用值x, y和z, x.equals(y)返回true, y.equals(z)返回true, x.equals(z)也必须返回true
4.一致性(consistent): 任何非null的引用值x和y,x和y中比较的信息没有变化,则多次调用就必须一致返回true,否则一致x返回false
5.非空性(Non-nullity): 任何非空的应用x, x.equals(null)必须返回false

覆盖equals方法,实现以上通用约定的一些诀窍:
1.使用==检查“参数是否为这个对象的引用“
2.使用instanceof操作符检查“参数是否为正确的类型”
3.把参数转换成正确的类型
4.对于一个实例中的每个关键字段,检查参数中的字段是否与该实例中对应的字段相匹配
5.编写网equals方法后,需要考虑:对称性,传递性,一致性

2.覆盖equals时必须同时覆盖hashCode

hashCode就是返回对象的hash值
不能用来判断相等,而是用来判断不相等

3.始终覆盖toString

建议所有子类覆盖这个方法

4.谨慎覆盖clone

5.考虑实现Comparable接口

compareTo方法并没有声明在Object类中, 而是Comparable接口中唯一的方法
在这里插入图片描述
实现了这个接口的类就可以按照compareTo中编写的规则,对这个类的实例的先后顺序进行比较,然后可以使用JDK提供的工具类Arrays和Collections对集合中的元素进行排序.
假设一个类ObjectImplComparable实现了Comparable接口,同时创建一个这个类的数组

ObjectImplComparable[] a = new ObjectImplComparable[10];
// 添加元素...
// 那么就可以使用下面的方式进行排序
Arrays.sort(a);

另外排序,计算极值, 和自动维护排序集合对于实现了Comparable的类来说也是非常容易的.

// String类实现了Comparable接口

覆盖compareTo方法的通用约定:
将对象和指定对象进行比较,小于返回负整数,等于返回0,大于返回正整数.

Guess you like

Origin blog.csdn.net/sunday2018/article/details/119984088