真实面经题目 · 原创解析

Java Object 类有哪些常见方法?

Java Object 类是所有类的根类,常见方法可以分为对象身份相关、运行时类型相关、字符串表示、克隆、线程协作和对象生命周期几类。面试回答要说明方法用途,也要点出 equals/hashCode、wait/notify、clone、finalize 的关键边界。

出现于:字节跳动 · 后端开发

60 秒回答模板

可以按类别回答。Object 的常见方法包括 equals、hashCode、toString、getClass、clone、wait、notify、notifyAll、finalize。equals 默认比较引用地址,常被重写为业务相等;hashCode 默认提供对象哈希值,重写 equals 时通常要一起重写;toString 默认输出类名加哈希值,常用于日志友好展示;getClass 返回运行时 Class 对象;clone 用于对象复制,但需要实现 Cloneable 并注意浅拷贝问题;wait、notify、notifyAll 用于对象监视器上的线程协作,必须在 synchronized 中调用;finalize 曾用于回收前清理,但不可靠且已不推荐使用。

考点 身份方法
难度 真实面经高频题
回答目标 讲清机制、边界和追问

深入解析

01

Object 是统一根类型

在 Java 中,所有普通类都直接或间接继承 Object,因此 Object 定义的方法构成了对象最基础的行为协议。即使一个类没有显式继承任何父类,也默认拥有 equals、hashCode、toString、getClass 等能力。理解这些方法,不只是记住方法名,更重要的是知道它们在集合、日志、反射、并发和对象复制等场景中分别承担什么职责。

02

equals 和 hashCode 定义身份语义

equals 默认实现相当于比较两个引用是否指向同一个对象,也就是引用相等。很多值对象会重写 equals,把相等性定义为字段值相等。hashCode 与 equals 配套使用,尤其影响 HashMap、HashSet 等哈希结构。重写 equals 时通常必须重写 hashCode,保证相等对象拥有相同哈希值,否则在哈希容器中可能出现查找不到、重复存储等问题。

03

toString 和 getClass 面向表达与类型

toString 默认返回类名、@ 符号和哈希值的十六进制表示,信息量有限,所以业务对象常重写它以便日志、调试和问题排查。getClass 是 final native 方法,返回对象运行时的 Class 对象,可用于反射、类型判断和框架元数据处理。需要注意的是,getClass 判断的是精确运行时类型,和 instanceof 的继承兼容判断并不完全一样。

04

clone 涉及复制语义

Object 中的 clone 方法用于创建对象副本,但它是 protected 方法,并且对象需要实现 Cloneable 接口,否则调用时会抛出异常。默认 clone 通常是浅拷贝,只复制对象本身的字段值;如果字段中包含引用类型,副本和原对象可能仍然共享同一个内部对象。因此 clone 的难点不在调用,而在明确到底需要浅拷贝、深拷贝,还是通过构造器、工厂方法提供更清晰的复制逻辑。

05

wait 和 notify 属于监视器协作

wait、notify、notifyAll 是 Object 的方法而不是 Thread 的方法,因为 Java 每个对象都可以作为监视器锁。线程必须先持有该对象的监视器,也就是处于 synchronized 保护区域内,才能调用这些方法。wait 会释放锁并进入等待,notify 或 notifyAll 唤醒等待线程,但被唤醒线程仍需重新竞争锁。finalize 也来自 Object,但执行时机不可靠,现代代码通常不应依赖它做资源释放。

易错点

  • 只背 Object 方法名,却说不清每个方法的典型使用场景。
  • 把 equals 默认行为误认为字段值比较。
  • 认为 wait 调用后不会释放锁,或认为 notify 后线程会立即继续执行。
  • 依赖 finalize 做关键资源释放,忽略其不可预测性和不推荐使用的事实。

面试官追问

Object 的 equals 默认比较什么?

默认比较引用是否相同,也就是两个引用是否指向同一个对象。只有重写之后,equals 才会按照业务字段或值语义来判断相等。

为什么 wait 和 notify 是 Object 的方法?

因为 Java 的锁是基于对象监视器的,每个对象都可以作为 synchronized 的锁对象。等待和唤醒发生在某个具体监视器上,所以这些方法定义在 Object 中。

clone 默认是深拷贝还是浅拷贝?

默认更接近浅拷贝。对象本身会被复制,但引用类型字段通常仍然指向原来的内部对象。如果需要深拷贝,需要自行处理嵌套对象复制。

finalize 为什么不推荐使用?

它的执行时机不可预测,也不保证一定及时执行,容易导致资源释放不可靠。释放文件句柄、连接、锁等资源应使用 try-with-resources 或显式关闭机制。