平衡封装、继承与多态的关键是按需分层协作:封装打底保障安全,继承搭骨架复用逻辑,多态在顶层提供灵活调度能力;抽象隐含其中不可或缺。

平衡封装、继承与多态,关键不是三者并列堆砌,而是按需分层协作:封装打底保障安全,继承搭骨架复用逻辑,多态在顶层提供灵活调度能力。抽象常隐含其中,不显式使用但不可或缺。
封装是基础防线,别为继承或多态牺牲它
即使要支持继承或多态,也不能把属性直接设为 public 或 protected 来“方便子类访问”。正确做法是:
- 所有字段一律 private,哪怕子类需要读写,也通过 protected getter/setter 提供受控入口
- 在 setter 中加入校验(如年龄范围、非空检查),这层逻辑不会因继承而失效,反而被所有子类共享
- 父类中可将部分方法声明为 final,防止子类意外覆盖关键行为(比如银行账户的余额校验逻辑)
继承用于建模“是什么”,不是“能做什么”
滥用继承容易导致类层次臃肿、耦合过紧。判断是否该用继承,看是否满足“is-a”关系:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- ✅ 适合:
Dog extends Animal(狗是一种动物)、AdminUser extends User(管理员用户是一种用户) - ❌ 慎用:为复用某段代码强行拉一个父类(如把“有日志功能”抽成父类),这时应优先考虑组合(has-a)而非继承
- 子类应专注扩展行为,而非重写父类核心职责;若频繁 override 同一方法且逻辑差异极大,说明继承层级可能设计失当,该考虑接口+多态
多态依赖前两者,但要靠抽象来“托住”
没有良好封装和合理继承,多态就容易变成“表面统一、内部混乱”。落地时注意:
- 多态的起点通常是 抽象类或接口,而不是具体类。例如定义
Shape抽象类或Drawable接口,再让Circle、Square实现,而非让它们都继承自某个“图形基类” - 运行时多态(父类引用指向子类对象)要求方法签名一致、返回类型协变,且子类 override 必须遵守父类契约(Liskov 替换原则)
- 避免在多态调用链中层层强转(如
((Dog) animal).bark()),那是封装失败、多态未真正落地的表现
实际协作的一条典型路径
以订单系统为例:
- 先用 封装 定义
Order类:私有status、amount,提供confirm()和cancel()方法,并内置状态流转校验 - 再用 继承 拆分类型:
OnlineOrder extends Order、OfflineOrder extends Order,各自复用基础字段和通用流程,只扩展支付方式、物流触发等差异点 - 最后用 多态 统一处理:
List<order> orders</order>遍历时调用process(),不同子类按需实现——此时封装保证数据不越界,继承保证结构清晰,多态让业务逻辑解耦
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










