5.2 Object:所有类的父类
Object类
是Java所有类的始祖,在Java中每个类都是有它拓展而来- 如果没有明确指出父类,Object就被认为是这个类的超类
- Object类型的变量只能用于作为各种值的通用持有者。
要想对其中的内容进行具体的操作, 还需要清楚对象的原始类型, 并进行相应的类型转换 - 在Java中,只有
基本类型(Primitive types)
不是对象
不是说万物皆对象吗????
5.2.1 equals方法
- 作用:
Object类中的equals方法用于检测一个对象是否等于另外一个对象
- 在Object类中,这个方法将判断两个对象是否具有相同的引用,
如果两个对象具有相同的引用,它们一定是相等的
如果两个对象状态相等,就认为这两个对象相等
- 在Object类中,这个方法将判断两个对象是否具有相同的引用,
getClass方法
:返回一个对象所属的类,在检测中,只有在两个对象属于同一个类时,才有可能相等- 在子类中定义equals方法时,首先调用父类的equals. 如果检测失败,对象就不可能相等. 如果父类中的域都相等,就需要比较子类中的实例域
5.2.2 相等测试与继承
- Java语言规范要求equals方法具有下列特性:
自反性
: 对于任何非空引用x,x.equal(x) is true
对称性
: 对于任何引用x和y,if y.equals(x) is true then x.equals(y) is true end if
传递性
: 对于任何引用x,y和z,if x.equals(y) is true and y.equals(z) is true then x.equals(z) is true end if
一致性
: 如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果- 对于任意非空引用x,
x.equals(null) is false
- 如果子类能够拥有自己的相等概念,则
对称性需求
将强制采用getClass
进行检测 - 如果由父类决定相等的概念,那么就可以使用
instanceof
进行检测,这样可以在不同子类的对象制间进行相等的比较
API | 所在包 | 描述 |
---|---|---|
static Boolen equals(type[] a,type[] b) |
java.util.Arrays |
如果两个数组长度相同, 并且在对应的位置上数据元素也均相同, 将返回true |
static boolen equals(Object a,Object b) |
java.util.Objects |
如果a和b都是null,返回true; 如果只有其中之一为null,则返回false; 否则返回a.equals(b) |
5.2.3 hashCode方法
散列码(hash code)
是由对象导出的一个整型值.- 散列码没有规律.两个不同的对象,它们的
hashCode()
基本上不会相同 - 由于
hashCode()
定义在Object类
中,因此每个对象都有一个默认的散列码,其值为对象的存储地址
- 散列码没有规律.两个不同的对象,它们的
- 如果
重新定义equals(),就必须重新定义hashCode()
,以便用户可以将对象插入散列表中 hashCode()应该返回一个整形数值(亦可为负数),并合理地组合实例域的散列码
,以便能够让各个不同的对象产生的散列码更加均匀- 最好使用
null安全
的方法Objects.hashCode.如果其参数为null,这个方法会返回0,否则返回对参数调用hashCode的结果 使用静态方法Double.hashCode来避免创建Double对象
需要组合多个散列值时,可以调用Objects.hash并提供多个参数.
这个方法会对各个参数调用Objects.hashCode(),并结合这些散列值- Equals与hashCode的定义必须一致
if x.equals(y) = true then x.hashCode() = y.hashCode()
- 如果存在数组类型的域,那么可以使用静态的Array.hashCode方法计算一个散列码,这个散列码由数组元素的散列码组成
API | 所在包 | 描述 |
---|---|---|
int hashCode() |
java.util.Objects |
返回对象的散列码 |
static int hash(Object... objects) |
java.util.Objects |
返回一个散列码,由提供的所有对象的散列码组合而得到 |
static int hashCode(Object a) |
java.util.Objects |
如果a为null返回0,否则返回a.hashCode() |
static int hashCode(int value) static int hashCode(long value) static int hashCode(short value) static int hashCode(byte value) static int hashCode(double value) static int hashCode(float value) static int hashCode(char value) static int hashCode(boolen value) |
java.lang.Integer java.lang.Long java.lang.Short java.lang.Byte java.lang.Double java.lang.Float java.lang.Character java.lang.Boolen |
返回给定值的散列码 |
static int hashCode(type[] a) |
java.util.Arrays |
计算数组a的散列码 |
5.2.4 toString方法
toString()
用于返回表示对象值的字符串- 最好通过
getClass().getName()
获得类名的字符串,而不要将类名硬加到toString()中 - 随处可见toString()的主要原因:
只要对象域一个字符串通过操作符“+”连接起来,Java编译就会自动地调用toString方法,以便获取改对象的字符串描述
- 强烈建议
为自定义的每一个类增加toString方法
API | 所在包 | 描述 |
---|---|---|
Class getClass() |
java.lang.Object |
返回包含对象信息的类对象 |
boolean equals(Object ontherObject) |
java.lang.Object |
比较两个对象是否相等, 如果两个对象指向同一块存储区域,方法返回true;否则返回false. 自定义的类中,应该覆盖该方法 |
String toString() |
java.lang.Object |
返回描述改对象值的字符串. 在自定义的类中,应该覆盖该方法 |
String getName() |
java.lang.Class |
返回该类的名字 |
Class getSuperclass() |
java.lang.Class |
以Class对象的形式返回这个类的父类信息 |