真实面经题目 · 原创解析
Java Object 类有哪些常见方法?
Java Object 类是所有类的根类,常见方法可以分为对象身份相关、运行时类型相关、字符串表示、克隆、线程协作和对象生命周期几类。面试回答要说明方法用途,也要点出 equals/hashCode、wait/notify、clone、finalize 的关键边界。
真实面经题目 · 原创解析
Java Object 类是所有类的根类,常见方法可以分为对象身份相关、运行时类型相关、字符串表示、克隆、线程协作和对象生命周期几类。面试回答要说明方法用途,也要点出 equals/hashCode、wait/notify、clone、finalize 的关键边界。
可以按类别回答。Object 的常见方法包括 equals、hashCode、toString、getClass、clone、wait、notify、notifyAll、finalize。equals 默认比较引用地址,常被重写为业务相等;hashCode 默认提供对象哈希值,重写 equals 时通常要一起重写;toString 默认输出类名加哈希值,常用于日志友好展示;getClass 返回运行时 Class 对象;clone 用于对象复制,但需要实现 Cloneable 并注意浅拷贝问题;wait、notify、notifyAll 用于对象监视器上的线程协作,必须在 synchronized 中调用;finalize 曾用于回收前清理,但不可靠且已不推荐使用。
在 Java 中,所有普通类都直接或间接继承 Object,因此 Object 定义的方法构成了对象最基础的行为协议。即使一个类没有显式继承任何父类,也默认拥有 equals、hashCode、toString、getClass 等能力。理解这些方法,不只是记住方法名,更重要的是知道它们在集合、日志、反射、并发和对象复制等场景中分别承担什么职责。
equals 默认实现相当于比较两个引用是否指向同一个对象,也就是引用相等。很多值对象会重写 equals,把相等性定义为字段值相等。hashCode 与 equals 配套使用,尤其影响 HashMap、HashSet 等哈希结构。重写 equals 时通常必须重写 hashCode,保证相等对象拥有相同哈希值,否则在哈希容器中可能出现查找不到、重复存储等问题。
toString 默认返回类名、@ 符号和哈希值的十六进制表示,信息量有限,所以业务对象常重写它以便日志、调试和问题排查。getClass 是 final native 方法,返回对象运行时的 Class 对象,可用于反射、类型判断和框架元数据处理。需要注意的是,getClass 判断的是精确运行时类型,和 instanceof 的继承兼容判断并不完全一样。
Object 中的 clone 方法用于创建对象副本,但它是 protected 方法,并且对象需要实现 Cloneable 接口,否则调用时会抛出异常。默认 clone 通常是浅拷贝,只复制对象本身的字段值;如果字段中包含引用类型,副本和原对象可能仍然共享同一个内部对象。因此 clone 的难点不在调用,而在明确到底需要浅拷贝、深拷贝,还是通过构造器、工厂方法提供更清晰的复制逻辑。
wait、notify、notifyAll 是 Object 的方法而不是 Thread 的方法,因为 Java 每个对象都可以作为监视器锁。线程必须先持有该对象的监视器,也就是处于 synchronized 保护区域内,才能调用这些方法。wait 会释放锁并进入等待,notify 或 notifyAll 唤醒等待线程,但被唤醒线程仍需重新竞争锁。finalize 也来自 Object,但执行时机不可靠,现代代码通常不应依赖它做资源释放。
默认比较引用是否相同,也就是两个引用是否指向同一个对象。只有重写之后,equals 才会按照业务字段或值语义来判断相等。
因为 Java 的锁是基于对象监视器的,每个对象都可以作为 synchronized 的锁对象。等待和唤醒发生在某个具体监视器上,所以这些方法定义在 Object 中。
默认更接近浅拷贝。对象本身会被复制,但引用类型字段通常仍然指向原来的内部对象。如果需要深拷贝,需要自行处理嵌套对象复制。
它的执行时机不可预测,也不保证一定及时执行,容易导致资源释放不可靠。释放文件句柄、连接、锁等资源应使用 try-with-resources 或显式关闭机制。