Java中extends关键字实现继承的核心是建立“子类是一种父类”的is-a关系,子类自动继承父类非私有成员,支持方法重写与多态;语法为class子类名extends父类名,仅支持单继承,构造器须通过super()初始化父类,重写需遵守访问权限不更严格等规则。

Java 中使用 extends 关键字实现继承,核心是建立“子类是一种父类”的 is-a 关系,不是为了拼凑代码,而是让类结构反映真实语义。它让子类自动获得父类的非私有成员(public、protected、包内 default),同时支持方法重写和多态。
继承的基本写法与前提条件
语法非常固定:子类定义时在类名后紧跟 extends 父类名,且只能写一个类名。
- Java 不支持多继承,class A extends B, C 是非法的,编译直接报错
- 如果没写 extends,该类默认隐式继承 Object
- 父类不能是 final 类(如 String),否则无法继承
- 父类的 private 成员不会被继承,子类中访问会编译失败
构造器必须显式或隐式调用 super()
构造器本身不被继承,但子类实例化时,父类部分必须被初始化。这靠 super() 完成。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 若父类有无参构造器,子类构造器可省略 super(),编译器自动插入
- 若父类只有带参构造器(比如 Person(String name)),子类构造器第一行必须写 super("xxx")
- super() 或 this() 必须是构造器的第一条语句,二者不能共存
- 普通方法里不能调用 super() —— 它只在构造器中有效
方法重写(Override)的关键规则
子类想改变父类某个行为,就用相同签名重新定义该方法,这就是重写。它依赖 extends 提供的基础,但受严格约束。
立即学习“Java免费学习笔记(深入)”;
- 只能重写 非 private、非 static、非 final 的方法
- 方法名、参数列表、返回类型(支持协变,如父类返回 Object,子类可返回 String)必须一致
- 子类方法的访问权限不能比父类更严格(public → protected 可以,反过来不行)
- 务必加上 @Override 注解,避免因签名微小差异(如 int vs Integer)导致意外重载而非重写
什么时候该用继承?什么时候不该用?
继承不是万能胶。判断是否合理,关键看语义是否成立,而不是有没有重复代码。
- 适合场景:经理是一种员工、正方形是一种图形、MySQL连接是一种数据库连接 —— 满足 is-a 且行为契约自然成立
- 不适合场景:为了复用几个工具方法就让 ReportGenerator extends EmailSender —— 这不是“是一种”,而是“用到了”,应改用组合(has-a)
- 警惕陷阱:在父类构造器中调用可能被重写的方法,会导致子类字段尚未初始化就被访问,引发空指针或逻辑错误
- 深层继承链(A→B→C→D)会让维护变困难,优先考虑提取接口或抽象类分层,或用组合替代

















