子类通过extends复用父类非私有成员,需注意访问权限、构造器调用、方法重写规则及模板方法模式;继承适用于is-a关系,has-a关系优先用组合,接口默认方法提供轻量复用。

子类通过继承复用代码,核心是利用 extends 关键字获得父类的非私有成员(字段、方法),并在需要时选择性地重写或直接调用。
继承基础:访问父类可复用的成员
Java 中,子类自动继承父类中 public 和 protected 修饰的字段与方法;若子类与父类在同一个包内,还能访问默认(package-private)成员。private 成员不可被继承,但可通过 public/protected 的 getter/setter 间接使用。
- 构造器不会被继承,但子类可通过 super() 调用父类构造器完成初始化
- 子类对象创建时,会先执行父类构造逻辑(隐式或显式 super()),再执行自身构造逻辑
- 避免重复定义已有功能——比如父类已有
calculateArea(),子类无需重写,直接调用即可
方法重写(Override):在复用基础上定制行为
当子类需要修改父类方法的实现逻辑时,可用 @Override 注解重写该方法。前提是方法签名(名称、参数列表、返回类型)完全一致,且访问权限不能更严格(如父类是 protected,子类不能改为 private)。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 重写时可借助 super.方法名() 复用父类原有逻辑,再叠加新行为
- 例如:父类
printInfo()打印基本信息,子类重写时先调用super.printInfo(),再补充打印特有属性 - 静态方法不能被重写(只能被隐藏),因此不参与多态,也不属于“运行时复用”范畴
利用模板方法模式:父类定义流程,子类填充细节
这是一种高级复用方式:父类用 final 方法封装固定执行流程,把可变部分声明为 abstract 或 protected 方法,由子类实现。
- 例如父类定义
process()(final),内部调用validate()、execute()、cleanup()—— 后三者由子类各自实现 - 这样既保证主干逻辑统一复用,又允许子类灵活定制关键步骤
- 比简单继承更结构化,适合有稳定框架、多变实现的场景
组合优于继承?注意复用的边界
继承适用于“is-a”关系(如 Dog is an Animal),但过度继承易导致紧耦合和脆弱基类问题。若只是“has-a”或“uses-a”关系,优先考虑组合(即在子类中持有父类对象引用)。
- 例如:类 A 需要使用类 B 的某些功能,但 A 并不是 B 的一种,那就用
private B b = new B();,再委托调用 - 组合更灵活、易测试、易替换,且不破坏封装;继承更适合语义明确、层级稳定的场景
- Java 8+ 接口默认方法也提供了一种轻量级复用机制,适合工具类行为的横向复用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










