OOP 清新脱俗的解释

面向对象对比面向过程,以及面向对象三大特性
1. 面向对象 vs 面向过程
面向过程注重事情的步骤和顺序;
面向对象注重事情的参与者(对象)以及各自要做什么。
比如洗衣机洗衣服:
-
面向过程将这项任务分解为若干步骤(函数):打开洗衣机、放衣服、放洗衣液、洗涤、甩干
-
面向对象会拆分人和洗衣机两个对象
-
人:打开洗衣机、放衣服、放洗衣液
-
洗衣机:洗涤、甩干
-
可见,面向过程比较直接高效,面向对象则更易于复用、拓展和维护。
2. 面向对象三大特性
- 封装 是一种对象功能内聚的表现形式,使模块之间耦合度变低,更具有 维护性。
- 继承 使子类能继承父类,获得父类的部分属性和行为,使模块更有 复用性。
- 多态 使模块在复用性基础上更加有 拓展性,使系统运行更有想象空间。
2.1 封装
访问控制权限 又称封装,核心是成员只对需要的类可见,即 内部细节对外部调用透明,外部调用无需修改或关心内部实现。
在 Java 类与对象 的笔记中提到 Java 四种访问权限,分别是 public、protected、无、private。
典型例子如另一篇笔记 Java 方法与构造方法 中的 getter/setter 方法,属性为私有的 Java Bean 通过 getter/setter 方法访问或赋值属性,不能由外部直接访问或修改,体现了属性的安全性和面向对象的封装性。
《码出高效》中将封装描述为 “由俭入奢易,由奢入俭难”。相较于直接访问,若想在修改属性的 setter 方法上对属性进行加密、鉴权、日志记录等,间接访问更为合适。
|
|
又如 ORM(对象关系映射) 框架,它是通过使用描述对象和数据库之间映射的元数据,将对象自动持久化到数据库中,我们无需关心映射如何建立、SQL 语句如何执行,只需引入框架,调用 CRUD 接口方法即可。
2.2 继承
继承满足了复用的需求,子类继承父类,父类的能力赋予子类。子类引用代替父类引用,说明两个类符合 里氏代换原则(LSP),可以使用继承关系。
但是继承存在方法污染和方法爆炸的危害性(方法污染指子类不具备执行父类所具备的行为的能力,方法爆炸指经过多次继承造成方法过多而带来不便和隐患),所以一般提倡使用 组合或聚合 关系来复用其它类的能力。
2.3 多态
在 Java 继承与多态 中已描述了多态的定义和使用。《码出高效》认为,多态专指覆写(override)。