如果没有明确指出超类, 那么 Object 是他的超类.
5.2.1 Object 类型的变量
只有基本类型不是对象:
- 数值
- 字符
- 布尔
数组是对象.
5.2.2 equals 方法
Object 的 equals 方法比较的是对象的引用是否相等.
- 经常做 equals 的其实是比较两个对象的状态是否相等
防备 name 或 hireDay 为 null:
子类的 equals 实现:
5.2.3 相等测试与继承
Java 要求 equals:
相等测试的问题:
编写完美 equals 的建议:
使用注解与编译器对话, 比如使用 **@Override**
告诉编译器重写方法, 避免无意间定义新方法.
5.2.4 hashCode 方法
String 类计算 hashCode 的算法:
int hash = 0;
for (int i = 0; i < length(); i++) {
hash = 31 * hash + charAt(i);
}
- Object.hashCode() 是根据对象地址算出的
- 如果重写 equals(), 那么必须重写 hashCode()
- hashCode 是整数 (有负的情况)
- 安全的 hashCode 方法: Objects.hashCode()
- null 对象返回0
- 使用 Double.hashCode 来避免 Double 对象
- 简便的 hashCode() 实现:
- 如果 x.equals(y) 返回 true, 那么 x.hashCode() 与 y.hashCode() 相等
5.2.5 toString 方法
大多数 toString 遵循的格式:
- 类名
- 方括号括起来的字段值
如果对象实现了 toString(), 那么可以用 +
拼接.
强烈建议为自定义类添加 toString()