Java多层继承通过连续extends构建A←B←C链,子类可访问所有非private成员;构造器需手动super链式调用;超三层建议用组合、接口替代。

Java 中多层继承是通过连续使用 extends 关键字构建继承链实现的,比如 A ← B ← C,C 间接继承 A 的所有可访问成员。它不等于多继承(一个类继承多个父类),Java 明确禁止后者。
多层继承的基本写法
每层子类都用 extends 显式声明其直接父类:
- class Animal { ... }
- class Mammal extends Animal { ... }
- class Dog extends Mammal { ... }
Dog 类可以直接使用 Animal 和 Mammal 中的 public/protected 成员,无需额外声明。
构造器调用必须手动链式传递
Java 不会自动向上调用多层父类构造器,每一层子类构造器都必须显式调用其直接父类的构造器(super(...)),且该语句必须是第一行:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- Mammal 构造器里要写 super(name) 调 Animal 的构造器
- Dog 构造器里要写 super(name, legCount) 调 Mammal 的构造器
- 如果某层父类没有无参构造器,子类就无法省略 super(...),否则编译失败
继承链上的成员访问规则
子类能访问父类中非 private 的字段和方法,包括间接父类的:
- Dog 可以直接调用 Animal 的 eat() 方法(只要它是 public 或 protected)
- 若 Dog 和 Mammal 都定义了同名字段,Dog 中用 super.字段名 访问 Mammal 的,再上一层需在 Mammal 中用 super 访问 Animal 的
- 所有类默认继承 Object,所以 Dog 实际有三层继承:Dog → Mammal → Animal → Object
替代与优化建议
当继承超过三层或逻辑变得复杂时,容易引发维护困难、初始化混乱等问题:
- 优先考虑用组合代替深层继承(例如 Dog 持有一个 Mammal 实例,而非继承它)
- 用接口补充行为能力(如 Dog implements Pet, Drawable),避免单继承限制
- 避免在构造器中调用可被重写的方法,防止子类字段尚未初始化就被访问

















