封装、继承、多态是可直接落地的结构工具:封装通过私有属性+带校验的setter实现;继承需满足is-a关系并遵守里氏替换;多态依托接口/父类声明与子类重写,运行时动态绑定。

封装、继承、多态不是概念游戏,而是日常编码中可直接使用的结构工具。落地的关键不在于背定义,而在于知道“什么时候用、怎么写、为什么这么写”。下面分三块说清楚。
封装:从“直接改属性”变成“走方法校验”
落地最简单也最容易被忽略。核心动作就两步:属性私有化 + 提供带逻辑的访问方法。
- 所有字段加 private,哪怕只是临时测试也不留 public 字段
- 用 getter/setter 是基础,但重点在 setter 里加约束——比如年龄不能负数、邮箱必须含 @、金额不能为 null
- 不强制每个字段都配 get/set;只暴露真正需要外部读写的字段,内部计算字段(如“是否成年”)直接提供 isAdult() 这样的业务方法
- 构造方法里也走 setter,确保初始化时同样受校验保护
继承:先问“真的是 is-a 关系吗?”
继承不是为了复用代码而强行拉关系,而是建模真实层级。落地前先自检:
- 子类对象能完全替代父类对象使用吗?(里氏替换原则)比如把 Dog 当 Animal 传参,调 eat() 不会出错,且语义合理
- 父类只放通用能力,比如 Animal 有 name、eat()、sleep();Dog 特有的 bark() 或 fetch() 放子类里
- 避免多层深继承(A → B → C → D),超过三层大概率设计偏了,考虑用组合替代
- 父类方法该用 protected 就用,不该暴露给外部的别设成 public
多态:靠接口/父类声明 + 子类实例实现
多态落地最典型的场景是“同一操作,不同对象做不同事”,关键在运行时决定行为。
- 声明类型用父类或接口,实际 new 的是子类对象,例如:Animal a = new Dog();
- 被调用的方法必须是被重写(@Override)的,且访问权限不能比父类更严格
- 优先面向接口编程:定义 PaymentProcessor 接口,让 WechatPay、Alipay 实现它;上层调用只依赖接口,不关心具体哪家支付
- 避免滥用 instanceof 判断类型再强转——那是多态的倒退,说明设计没到位
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











