Object类是Java所有类的根父类,其方法直接支撑封装、继承、多态三大特性:toString()和equals()实现封装下的安全数据表达与比较;getClass()和instanceof保障继承关系的运行时识别;wait/notify系列方法提供并发下统一的线程协作多态接口;clone()则体现封装与继承协同的对象复制机制。

Object 类是 Java 中所有类的根父类,它的方法不是“锦上添花”,而是直接为封装、继承、多态三大特性提供底层支撑。理解这些方法如何工作,等于看清了面向对象在 JVM 层面的运行逻辑。
toString() 和 equals():封装的数据表达与安全比较
封装强调隐藏内部状态、只暴露可控接口。但外部仍需以合理方式读取或判断对象内容——toString() 和 equals() 就是这两类需求的标准出口。
- toString() 默认返回类名+哈希码(如 Person@1b6d3586),它不暴露字段细节,符合封装“隐藏实现”的原则;开发者重写它时,可按需暴露有意义的信息(比如 "Person{name='张三', age=25}"),始终由类自身控制输出格式。
- equals() 默认用 == 比较引用,这保护了对象身份的语义;重写后(通常配合 hashCode())才能基于业务逻辑比较内容(如两个 Person 是否姓名年龄都相同)。这种“是否相等”由类自己定义,而不是让调用方直接访问私有字段去比,正是封装对数据访问权的把控。
getClass() 和 instanceof:继承关系的运行时确认
继承建立的是“is-a”关系,而多态依赖这种关系在运行时被识别。Object 提供的 getClass() 和配合使用的 instanceof(虽非 Object 方法,但语义紧耦合)是关键基础设施。
- getClass() 返回 Class<?> 对象,能精确获取实例的真实类型(哪怕变量声明为父类),这是实现运行时类型检查、动态代理、序列化等机制的基础。
- 比如子类 Dog 继承 Animal,一个 Animal a = new Dog(); 的引用,调用 a.getClass() 得到的是 Dog.class,不是 Animal.class。这个能力让框架(如 Spring、Jackson)能准确识别实际类型,支撑泛型擦除后的类型还原和 JSON 反序列化。
wait()/notify()/notifyAll():多态在并发场景下的延伸
多态不只是方法调用的动态绑定,也体现在对象协作行为的统一抽象上。Object 的线程通信方法把“等待”和“唤醒”这两个通用协作动作,定义为所有对象天然具备的能力。
立即学习“Java免费学习笔记(深入)”;
- 任何对象都能作为同步监视器(monitor),调用 wait() 进入等待队列,或用 notify() 唤醒其他线程——这种能力不依赖具体类的设计,是语言级赋予的多态契约。
- 比如生产者-消费者模型中,Queue、Buffer 或自定义的 ResourcePool 都可直接使用这些方法协调线程,无需各自实现一套等待/通知协议。这就是“不同对象,同一套协作接口”的多态体现。
clone():封装与继承协同下的对象复制机制
clone() 是一个特殊桥梁:它既依赖封装(要求类明确声明支持克隆并管理内部状态复制),又依赖继承(必须实现 Cloneable 接口——一个空标记接口,本质是继承体系中的能力声明)。
- 默认 clone() 是浅拷贝,若类包含可变引用字段(如 List<String>),开发者需在重写时手动深拷贝——这个过程强制你审视内部状态的封装边界。
- 同时,Cloneable 不是 Object 的方法,但它只有在继承链中显式声明,Object 的 clone() 才会执行成功,否则抛 CloneNotSupportedException。这体现了继承对行为能力的传递与约束。


















