大厂限制继承深度不超过三层,核心是防范理解成本飙升、调试路径模糊、维护风险失控三类现实风险;推荐组合+接口替代深继承,使职责更清晰、复用更可控。

大厂规范限制类继承深度不超过三层,核心不是技术上做不到,而是这种结构会迅速放大三类现实风险:理解成本飙升、调试路径模糊、维护风险失控。对初学者尤其不友好。
理解模型快速超载
每多一层继承,子类就要多理清一层状态来源和行为归属。比如 Object → Entity → User → AdminUser → SuperAdminUser 这样的五层链,初学者很难快速判断:
- id 字段是定义在 Entity 还是被 User 重定义?
- save() 方法实际执行的是哪一层的逻辑?
- 构造器中 super() 调用到底串起了几层初始化顺序?
这些不是语法错误,而是认知过载——人脑难以在线性阅读中同步追踪超过三层的隐式依赖。
错误定位变得低效且碎片化
运行时出问题时,堆栈信息常跨越多个类,但真正的问题根源可能藏在中间某层被忽略的细节里:
- toString() 在第三层被覆盖,加了非空校验,而第四层没适配,导致空指针却报在最外层
- 某层父类悄悄修改了 equals() 的字段比较范围,下游所有子类在集合操作中行为异常,却无编译提示
- 修改第二层的 protected 方法签名,第五层直接编译失败,但错误提示不指向源头,新手容易反复排查错误位置
父类改动引发不可控连锁反应
深继承让类之间形成强耦合,父类一次看似安全的调整,可能在下游数层引发雪崩:
- 父类新增一个 @NonNull 字段,所有子类构造器若未显式初始化,全部编译报错
- 中间层父类改用 Lombok @Builder,但未处理默认值逻辑,导致下游子类构建对象时字段为空
- 某层重写了 clone() 却未调用 super.clone(),整个继承链的浅拷贝行为失效,且难以通过单元测试覆盖
有更轻量、更可控的替代方式
大厂鼓励初学者用组合 + 接口代替深继承,不是放弃复用,而是让复用意图更明确、边界更清晰:
- 把通用能力拆成独立组件,如 Timestamped、Versioned、Validatable,通过字段持有,职责一目了然
- 用接口定义“能做什么”,如 Exportable、Searchable,实现类按需声明,不绑定生命周期或字段结构
- 若必须共享逻辑,优先用抽象类 + 模板方法(如 abstract void doPersist()),把可变部分收口,而非开放任意方法供子类覆盖

















