java中extends实现继承的核心是建立“is-a”关系,使子类天然拥有父类共性能力并安全定制;它遵循单继承、可见性规则、super调用强制性等严格机制,而非简单代码复制。

Java 中用 extends 实现继承,核心目标不是“多写一行代码”,而是让子类天然拥有父类的共性能力,并在需要时安全定制。它不是简单的复制粘贴,而是一套有规则、有边界、讲时机的复用机制。
继承不是抄代码,是建关系
extends 声明的是“is-a”关系:Dog 是 Animal,Employee 是 Person。这种语义决定你是否该用继承——如果只是“有某个功能”(比如 Car 有 Engine),就该用组合,而不是 extends Engine。
- 一个类只能 extends 一个父类,Java 不支持多继承
- 子类自动获得父类的 public、protected 和同包下的 default 成员;private 成员不可见,也不可继承
- 构造器不会被继承,但子类必须通过 super() 显式或隐式调用父类构造器,且 super() 必须是子类构造器的第一条语句
- static 方法不参与继承链,子类中同名方法属于“隐藏”,不是重写
字段和方法怎么真正复用起来
复用的前提是字段和方法对子类可见,且在对象创建时正确初始化。
- 把通用字段(如 id、name、createTime)定义在父类中,用 protected 或 public 修饰
- 在父类构造器里完成这些字段的初始化,比如 this.id = System.nanoTime();
- 子类构造器第一行写 super() 或 super(args),确保父类部分先准备好
- 通用逻辑(如校验、日志、序列化前处理)封装成 protected 方法,子类可直接调用,也可重写
重写(Override)要留出口,别断掉复用链
重写不是推倒重来,而是“在父类基础上加一点自己的东西”。漏掉 super 调用,往往意味着丢失关键逻辑。
- 重写方法必须保持签名一致(方法名、参数列表、返回类型兼容),建议加 @Override 注解
- 若需保留父类行为,务必显式写 super.methodName(),不能只写 methodName()(否则递归调用自己)
- 访问权限不能更严格(如父类是 protected,子类不能改成 private),但可以更宽松(如改为 public)
- final 方法不可重写;static 方法不可重写(只能隐藏)
常见踩坑点,一踩一个准
很多编译错误或运行时异常,其实都源于对 extends 规则理解不到位。
- 父类只有带参构造器 → 子类没写 super(args) → 编译报错 “Implicit super constructor is undefined”
- 在 super() 前使用 this.xxx 或普通语句 → 编译报错 “Call to super() must be first statement”
- 子类定义了和父类同名字段 → 发生字段遮蔽,访问时取决于引用类型,容易误判值
- 误以为 private 方法能被继承或重写 → 实际上子类根本看不到它,也不存在重写一说
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











