java中所有类默认继承object,需正确重写tostring()、equals()与hashcode()等方法:tostring()应返回核心状态且避免副作用;equals()与hashcode()必须同步重写以满足契约;clone()和finalize()应谨慎使用,后者已废弃。

Java 中所有类都默认继承自 Object 类,因此即使你没显式写 extends Object,也能直接重写它的方法,比如 toString()、equals(Object obj)、hashCode() 等。关键不是“怎么利用 Object 的方法”,而是“如何正确重写它们”,否则可能引发逻辑错误或违反契约。
重写 toString():让打印更可读
默认的 toString() 只返回类名+哈希码(如 Person@1b6d3586),对调试和日志不友好。重写时应返回对象核心状态的字符串表示:
- 用
@Override显式标注,避免拼写错误导致未重写成功 - 避免返回
null,建议用Objects.toString(field)处理可能为空的字段 - 不要在
toString()中调用耗时操作或触发副作用(如 I/O、修改状态)
示例:
private String name;
private int age;
@Override
public String toString() {
return "Person{name='" + name + "', age=" + age + "}";
}
}
重写 equals():必须同时重写 hashCode()
equals() 和 hashCode() 是强绑定的契约:若两个对象 equals() 返回 true,它们的 hashCode() 必须相等。否则在 HashMap、HashSet 中会出错。
- 先用
==判断是否为同一引用(提升性能) - 再用
instanceof或getClass() == obj.getClass()判断类型(推荐后者以保证对称性) - 强制转换后逐个比较关键字段,注意处理
null(可用Objects.equals(a, b)) - 重写
equals()后,务必用 IDE 自动生成或手动编写匹配的hashCode()(如用Objects.hash(...))
重写 hashCode():保持一致性与分布性
只要参与 equals() 比较的字段变了,hashCode() 就必须变;反之,只要这些字段不变,hashCode() 就不能变(哪怕对象其他字段被修改)。
- 推荐用
Objects.hash(field1, field2, ...),简洁且自动处理null - 避免使用随机数、当前时间、或可变字段(如集合大小动态变化时)作为哈希依据
- 如果类是不可变的,可在构造时计算并缓存
hashCode值,提升性能
谨慎重写 clone() 和 finalize()
clone() 属于浅拷贝,默认受保护(protected),需实现 Cloneable 接口并改为 public 才能外部调用;finalize() 已在 Java 9 标记为废弃,JVM 不保证执行时机,也不保证执行次数,不应依赖它释放资源(改用 try-with-resources 或 Cleaner)。
- 如需深拷贝,建议用构造函数、静态工厂方法或序列化方式替代
clone() - 永远不要在
finalize()中恢复对象引用(即“复活”),这会导致不可预测行为
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











