object类是java对象模型的骨架,其方法对应真实编程场景:tostring()用于调试日志,需重写聚焦核心字段;equals()与hashcode()构成哈希结构契约,须同步重写并满足五条规则;getclass()返回运行时类型,clone()默认浅拷贝;wait/notify需在synchronized内使用,推荐用juc替代。

Object 类不是“默认附带的一堆方法”,而是 Java 对象模型的骨架——它提供的每个方法,都对应一个真实、不可回避的编程场景。理解它们,关键在于看清设计意图和落地约束。
toString():调试与日志的入口开关
默认输出 类名@哈希码,本质是告诉开发者“这是谁、在哪”,但对业务毫无意义。真正起作用时,它出现在 System.out.println()、SLF4J 日志打印、IDE 变量窗、JSON 序列化前的 toString 备用路径中。
- 重写必须聚焦核心字段(如 ID、状态、名称),不堆砌全部属性
- 避免包含敏感信息(密码、token)、未初始化集合或递归引用(如 parent 字段)
- 格式保持稳定:比如始终用
Person{name='张三', id=1001},不要某次加括号、某次去空格,否则日志解析规则会失效
equals() 与 hashCode():哈希结构的契约双子
这两个方法从来不是独立存在的。equals() 定义“什么算相等”,hashCode() 则保证相等对象能落在哈希表同一个桶里。违反契约的后果很直接:对象放进 HashSet 后查不到,HashMap.get(key) 返回 null。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
equals()重写必须满足五条契约(自反、对称、传递、一致、非空),推荐用Objects.equals(a, b)处理 null 字段 -
hashCode()必须用参与 equals 比较的**相同字段**计算,推荐Objects.hash(id, name, status) - 类型检查要用
getClass() == obj.getClass(),不用instanceof,防止子类重写后破坏对称性
getClass() 与 clone():类型安全与复制边界的分水岭
getClass() 是 final 方法,返回运行时真实类型——它比 instanceof 更严格,能区分代理类、CGLIB 增强对象等场景,常用于反射实例化或白名单校验。
clone() 默认不可用,需实现 Cloneable 接口并重写。它天生是浅拷贝:若对象含 List 或自定义引用字段,克隆后双方仍共享底层数据。
- 真要深拷贝,优先考虑构造器传参、Builder 模式或序列化反序列化,比手动递归 clone 更可控
- 除非明确需要浅拷贝且性能敏感,否则不建议启用 clone 机制
wait()/notify()/notifyAll():同步原语的“锁内限定”
这三个方法不是普通工具,而是 JVM 级线程协作指令。它们只在 synchronized 块内合法调用,否则抛 IllegalMonitorStateException。
-
wait()释放锁并挂起当前线程;notify()随机唤醒一个等待者;notifyAll()唤醒全部 - 实际开发中,应优先使用
java.util.concurrent包下的高级抽象(如Condition、CountDownLatch),它们更安全、语义更清晰 - 理解这组方法的价值,在于读懂老代码、排查死锁、或定制低层并发组件
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










