Java继承通过extends实现代码复用与扩展:子类自动获得父类非私有成员,支持添加新成员或重写方法;需注意private不可继承、构造器须显式调用super、单继承限制及避免过度继承,结合多态提升系统扩展性。

继承是 Java 中实现代码复用最直接的方式——子类通过 extends 关键字获得父类的非私有成员(字段和方法),无需重复编写相同逻辑,同时保留扩展和定制的能力。
复用的是什么?
子类自动继承父类中 public 和 protected 修饰的字段与方法,以及默认访问权限(包内可见)的成员(前提是子类与父类在同一个包中)。private 成员不会被继承,但可通过 public/protected 的 getter/setter 或方法间接使用。
- 复用已有业务逻辑:比如父类
Animal定义了eat()和sleep(),所有子类(Dog、Cat)天然具备这些行为 - 复用通用状态:如父类定义
String name和int age,子类无需再声明,可直接使用或通过this.name访问 - 复用模板结构:配合 abstract 方法,父类定义流程骨架(如
templateMethod()),子类只实现差异部分,实现“复用不变,重写可变”
怎么让复用更安全、更可控?
不是所有成员都适合被继承复用。合理设计访问修饰符和类结构,能避免误用和破坏封装。
- 把希望被复用的字段设为 protected(比 public 更安全,限制在继承体系内访问)
- 避免 public 字段,改用 protected 字段 + public getter/setter,便于后续加校验或日志
- 用 final class 防止被继承(如
String),用 final 方法 防止被重写(如关键校验逻辑) - 构造器不被继承,但子类可用
super(...)复用父类初始化逻辑
复用 ≠ 照搬:重写(Override)是关键配合
继承提供基础能力,重写让复用落地到具体场景。只有方法签名一致且满足访问权限要求,才算有效重写。
立即学习“Java免费学习笔记(深入)”;
- 子类重写父类方法时,可用
super.methodName()在新逻辑中调用原有实现,实现“增强式复用” - @Override 注解不是必须的,但强烈建议加上——它能帮编译器检查是否真正在重写(防止拼写错误或参数不同导致意外重载)
- 静态方法不能被重写(只能被隐藏),所以不要指望通过继承复用 static 行为;需要复用工具逻辑,优先考虑组合或工具类
比继承更灵活的复用方式:组合优于继承
当“is-a”关系不自然,或需要运行时动态切换行为时,继承反而会僵化代码。此时用组合(has-a)更合适。
- 例如:
Car“有”一个Engine,而不是“是一种 Engine”;更换引擎只需替换对象,不用改类结构 - 组合复用依赖于对象引用,天然支持多态和依赖注入,测试和维护更简单
- Java 标准库大量使用组合:比如
ArrayList内部用数组,HashMap内部用 Node 数组+链表/红黑树,都不是靠继承实现复用


















