object类是java所有类的根父类,其核心方法需按契约重写:tostring()提升可读性,equals()与hashcode()必须同步重写以保障集合正确性,getclass()提供不可变的运行时类型信息,wait/notify/clone/finalize等方法则应优先选用现代替代方案。

Object 类是 Java 所有类的根父类,它的方法定义了对象最基础的行为。全面理解不在于死记方法名,而在于抓住每个方法的语义目的、使用边界和常见陷阱。
toString():让对象“会说话”
默认返回 类全名@十六进制哈希值(如 com.example.User@1b6d3586),本质是内存地址快照,对调试和日志毫无帮助。重写它,是为了让 System.out.println(obj)、日志输出、单元测试断言等场景能一眼看懂对象状态。
- 用
Objects.toString(field, "null")安全处理 null 字段 - 避免打印密码、token、身份证号等敏感字段
- 含父子/循环引用时(如 User → Order → User),需手动控制递归深度或用 @ToString(exclude = "...") 防 StackOverflowError
equals() 和 hashCode():必须成对出现的契约
这两个方法不是风格选择,而是 JVM 集合类正常工作的底层契约。只重写 equals() 不重写 hashCode(),会导致对象在 HashMap 中找不到、HashSet 重复添加——这是生产环境高频 bug。
- 重写 equals() 四步法:先判
this == obj;再判obj == null || getClass() != obj.getClass();然后强转;最后用Objects.equals(a, b)逐字段比较 - hashCode() 必须用 完全相同 的字段计算,且推荐用
Objects.hash(name, age, status) - IDE 自动生成基本可靠,但要检查是否漏掉新增字段或误含 volatile / transient 字段
getClass():比 instanceof 更严格的类型身份证
它返回对象实际创建时的类,不可被覆盖,结果绝对可信。适用于需要“类精确匹配”的场景,而非“允许子类”的宽松判断。
- 缓存 key 设计中,
a.getClass() == b.getClass()可防止不同子类实例误命中同一缓存槽 - 策略路由时区分
PaymentStrategyA和PaymentStrategyB,不希望其父类AbstractPayment模糊匹配 - 反射起点:
obj.getClass().getDeclaredField("xxx")是安全获取私有字段的第一步
wait/notify/clone/finalize:知道存在,但优先选现代替代方案
这些方法属于历史语义保留型 API,面试问到重点不在手写,而在是否清楚它们的约束与风险。
-
wait()和notify()必须在synchronized块内调用,否则抛IllegalMonitorStateException -
clone()要求类实现Cloneable接口,且浅拷贝居多;更推荐构造器复制或BeanUtils.copyProperties() -
finalize()自 Java 9 起已标记为废弃,无确定执行时机,资源清理应改用try-with-resources或Cleaner
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











