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.Integerjava.lang.Longjava.lang.Shortjava.lang.Bytejava.lang.Doublejava.lang.Floatjava.lang.Characterjava.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对象的形式返回这个类的父类信息 |