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 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 格式建议:类名 +
{字段=值, 字段=值},例如Person{name='Alice', age=30} - 优先使用
Objects.toString()或String.format(),避免手动拼接 null 引发异常 - 不要在
toString()中执行耗时操作(如数据库查询、文件读取)或修改对象状态
谨慎重写的:clone()
clone() 默认是浅拷贝,且要求类实现 Cloneable 接口(否则抛 CloneNotSupportedException)。重写时要注意:
立即学习“Java免费学习笔记(深入)”;
- 必须调用
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或显式资源管理

















