Java中所有类默认继承Object,必须正确重写toString()、equals()和hashCode():toString()应体现关键业务字段且避免敏感信息;equals()与hashCode()须成对重写,逻辑一致并用Objects工具类简化;getClass()比instanceof更安全;wait/notify/clone/finalize等方法普通场景无需重写。

Java 中所有类默认继承 Object,所以你无需写 extends Object,但必须理解如何正确使用它提供的核心方法——尤其是 toString()、equals() 和 hashCode()。这些方法不是“摆设”,用错或忽略会导致日志混乱、集合异常、逻辑错误等实际问题。
重写 toString() 要体现关键业务字段
默认的 toString() 只返回类名+哈希码(如 Person@1b6d3586),对调试和日志毫无帮助。应重写为可读格式,只包含有意义的属性:
- 用 IDE 自动生成(IntelliJ:Alt+Insert → “toString”;Eclipse:右键 → Source → Generate toString)
- 避免包含敏感信息(如密码、token)或大对象(如 byte[]、List 长度超百)
- 若对象用于日志,建议字段间用逗号或等号分隔,便于快速扫描:
Person{name='张三', age=28, id=1001}
equals() 和 hashCode() 必须成对重写
只要重写了 equals(),就必须重写 hashCode(),否则放入 HashSet、HashMap 时会出错——相同对象可能被当成不同键,导致重复添加或查不到。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 判断逻辑要一致:比如两个
Person对象,仅当id相同就认为相等,那hashCode()就该基于id计算 - 不要用可变字段(如
name)参与hashCode()计算,除非该字段在对象生命周期内绝不改变 - 推荐用
Objects.equals(a, b)和Objects.hash(...)简化实现,自动处理 null 安全
谨慎调用 getClass() 与 instanceof 的选择
equals() 实现中,常需判断类型是否匹配。用 getClass() == obj.getClass() 更严格(子类对象不等于父类对象),而 instanceof 允许子类实例通过检查(可能破坏对称性)。多数业务场景推荐前者,尤其当你不希望 new Student().equals(new Person()) 返回 true。
立即学习“Java免费学习笔记(深入)”;
- 若明确支持“向上兼容比较”(如 JPA 实体按主键比),再考虑
instanceof - 永远避免在
equals()中调用可能抛异常或耗时的方法(如数据库查询)
其他 Object 方法通常无需重写
wait()、notify()、clone()、finalize()(已废弃)等方法,普通业务类极少需要干预。除非你正在写线程协作工具类或需要深拷贝逻辑,否则保持默认行为更安全。
- 想支持克隆?优先用构造器复制或第三方库(如 Apache Commons Lang 的
SerializationUtils.clone()) -
finalize()已在 Java 9 标记为废弃,Java 18 彻底移除,切勿依赖 -
getClass()和wait()/notify()是 final 方法,无法重写

















