如果没有明确指出超类, 那么 Object 是他的超类.

5.2.1 Object 类型的变量

只有基本类型不是对象:

  • 数值
  • 字符
  • 布尔

数组是对象.

5.2.2 equals 方法

Object 的 equals 方法比较的是对象的引用是否相等.

  • 经常做 equals 的其实是比较两个对象的状态是否相等

image.png

防备 name 或 hireDay 为 null:

image.png

子类的 equals 实现:

image.png

5.2.3 相等测试与继承

Java 要求 equals:

image.png

相等测试的问题:

image.png

image.png

编写完美 equals 的建议:

image.png
image.png

使用注解与编译器对话, 比如使用 **@Override** 告诉编译器重写方法, 避免无意间定义新方法.

5.2.4 hashCode 方法

String 类计算 hashCode 的算法:

  1. int hash = 0;
  2. for (int i = 0; i < length(); i++) {
  3. hash = 31 * hash + charAt(i);
  4. }
  • Object.hashCode() 是根据对象地址算出的
  • 如果重写 equals(), 那么必须重写 hashCode()
  • hashCode 是整数 (有负的情况)

image.png

  • 安全的 hashCode 方法: Objects.hashCode()
    • null 对象返回0
  • 使用 Double.hashCode 来避免 Double 对象
  • 简便的 hashCode() 实现:

image.png

  • 如果 x.equals(y) 返回 true, 那么 x.hashCode() 与 y.hashCode() 相等

5.2.5 toString 方法

大多数 toString 遵循的格式:

  • 类名
  • 方括号括起来的字段值

image.png

如果对象实现了 toString(), 那么可以用 + 拼接.

强烈建议为自定义类添加 toString()