java中所有类均继承自object,其13个方法(jdk21新增describeconstable())需按契约谨慎重写:equals()与hashcode()必须配套重写并保持一致性;tostring()建议重写以提升可读性;clone()需注意深浅拷贝及访问权限;getclass()、wait/notify等底层方法通常不应重写。

在 Java 中,所有类都直接或间接继承自 Object 类,因此每个对象默认拥有 Object 提供的 12 个方法(JDK 21 中为 13 个,新增了 describeConstable())。重写这些方法的关键是:**只重写你真正需要改变行为的方法,并遵循其契约(contract)**,尤其是 equals()、hashCode()、toString() 和 clone() 这几个最常用且易出错的方法。
必须配套重写的:equals() 和 hashCode()
equals() 和 hashCode() 是一对“绑定契约”:如果两个对象逻辑上相等(equals() 返回 true),它们的 hashCode() 值**必须相同**;反之不强制。重写时需注意:
- 使用
@Override注解,避免拼写错误或签名不匹配(如把Object obj写成String obj) -
equals()中先用==判断是否为同一引用,再用instanceof检查类型,最后逐字段比较(推荐用Objects.equals(a, b)处理 null) -
hashCode()推荐用Objects.hash(field1, field2, ...)自动生成,确保与equals()使用的字段完全一致 - 不要在
hashCode()中依赖可变字段(如后续会修改的name),否则放入HashSet后可能无法找回
建议重写的:toString()
toString() 用于调试和日志输出,默认返回 类名@哈希值(如 Person@1b6d3586),可读性差。重写后应清晰表达对象的核心状态:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 格式建议:类名 +
{字段=值, 字段=值},例如Person{name='Alice', age=30} - 优先使用
Objects.toString()或String.format(),避免手动拼接 null 引发异常 - 不要在
toString()中执行耗时操作(如数据库查询、文件读取)或修改对象状态
谨慎重写的:clone()
clone() 默认是浅拷贝,且要求类实现 Cloneable 接口(否则抛 CloneNotSupportedException)。重写时要注意:
- 必须调用
super.clone()获取副本,再对引用类型字段做深拷贝(如重新 new 对象、调用其clone()或序列化) - 重写后的
clone()方法应声明为public(父类中是protected) - 现代 Java 更推荐用构造器复制、静态工厂方法或记录类(
record)替代clone(),更安全、语义更清晰
通常不建议重写的其他方法
getClass()、notify()、notifyAll()、wait()、finalize()(已弃用)、wait(long)、wait(long, int) 等方法与 JVM 底层机制强相关,普通业务类不应重写。特别是:
-
getClass()返回运行时真实类,重写会破坏多态和类型安全 -
wait/notify必须在同步块中调用,且由 JVM 管理线程调度,自行重写无意义 -
finalize()自 JDK 9 起被标记为废弃,JDK 18 彻底移除,应改用Cleaner或显式资源管理
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










