object类是java所有类的隐式根父类,由编译器自动插入extends object,提供tostring()、equals()等11个基础方法,支撑多态、异常、序列化、泛型擦除及线程通信等核心机制。

Java 中 Object 类作为所有类的根父类,不是靠开发者手动写 extends Object 实现的,而是由编译器自动完成的隐式继承。只要你定义一个类,不管有没有显式声明父类,它在字节码层面都已是 Object 的子类。
编译器自动补全继承关系
Java 编译器(javac)在编译阶段会检查每个类的继承声明:如果没写 extends,就默认插入 extends Object。所以这两段代码完全等价:
class Person { }class Person extends Object { }
你用 IDE 查看任意类的继承树(比如按 Ctrl+H),最顶层永远是 java.lang.Object ——包括数组、枚举、注解、甚至 Lambda 表达式生成的合成类。
所有引用类型都天然兼容 Object
因为继承关系的存在,任何对象都能被当作 Object 类型来使用,这是多态的基础:
- 方法参数可以统一接收
Object obj,传入String、ArrayList、自定义User都合法 - 集合如
ArrayList<object></object>能存任意对象(泛型擦除后实际也是操作Object引用) - 异常体系中,
Throwable直接继承Object,所以catch (Exception e)本质是在捕获Object子类实例
Object 提供的方法是所有对象的“出厂能力”
它定义了 11 个公开或受保护方法(如 toString()、equals()、hashCode()、getClass()、clone()、wait() 等),这些方法不需要子类实现就能调用——但多数默认行为只适用于调试或底层协作,业务中通常需要重写:
-
toString()默认返回类名@哈希值,不重写就看不出对象内容 -
equals()默认比较内存地址,不重写会导致两个相同字段的对象被判为“不等” -
hashCode()必须与equals()保持一致,否则放进HashMap会出错 -
getClass()不可重写,是反射和类型判断的唯一可靠依据
Object 的存在支撑 JVM 关键机制
它不只是语法约定,更是运行时功能的基石:
- JVM 加载类时强制要求类结构以
Object为终点,保障类型系统闭环 - 每个对象都有监视器(monitor),
wait()/notify()依赖这个机制实现线程通信 - 序列化时
ObjectOutputStream写入的是Object引用,反序列化再还原具体类型 - 泛型擦除后,集合的
get()方法返回Object,再由编译器插入强制转型
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











