Java中所有未用extends显式声明父类的类,都默认继承java.lang.Object类。这是Java语言规范强制要求,Object是类层次的唯一根节点,提供toString()、equals()、hashCode()等基础方法,支撑instanceof、泛型擦除等机制。

Java中所有未用extends显式声明父类的类,都会默认继承java.lang.Object——这不是约定,而是语言规范强制要求的结果。
Object是Java类体系的唯一根节点
Java采用单根继承结构,Object位于整个类层次的顶端。无论你写的是class User{}、class Config{}还是空类class A{},编译后都等价于:
class User extends java.lang.Object {}class Config extends java.lang.Object {}
这种设计保证了所有对象具备统一的基础行为,比如能调用toString()、equals()、hashCode(),也支撑了instanceof判断、泛型擦除后的类型回退等关键机制。
编译器与JVM共同落实这一规则
从JDK 7起,是否添加extends Object由JVM在加载类时动态补全,而非编译器硬编码进字节码。但效果一致:
立即学习“Java免费学习笔记(深入)”;
- 反编译一个无
extends的类,通常看不到extends Object字样,但运行时MyClass.class.getSuperclass()一定返回class java.lang.Object - IDE能在你敲
.时立刻列出Object的方法,说明编译器和编辑器都内置了该语义规则
不能绕过,也不能取消
这个继承关系无法被跳过或屏蔽:
- 即使类声明为
final(如String),它仍是Object的子类;只是不能再被别人继承 - 接口(
interface)不继承Object,但实现该接口的类仍必须继承Object - 没有“无父类”的Java类——语法上不允许,JVM加载时也会拒绝没有超类信息的类文件
实际影响远不止“多几个方法”
理解默认继承Object,直接关系到日常开发的多个关键点:
- 重写
toString()让日志可读,重写equals()和hashCode()才能正确放入HashSet或作为HashMap键 - 序列化、反射、代理(如Spring AOP)底层都依赖
Object提供的通用契约 - 异常类、数组类型、枚举类型,全部隐式继承自
Object,因此都能向上转型为Object引用


















