目录

OOP 清新脱俗的解释

面向对象对比面向过程,以及面向对象三大特性

1. 面向对象 vs 面向过程

面向过程注重事情的步骤和顺序;

面向对象注重事情的参与者(对象)以及各自要做什么。

比如洗衣机洗衣服:

  • 面向过程将这项任务分解为若干步骤(函数):打开洗衣机、放衣服、放洗衣液、洗涤、甩干

  • 面向对象会拆分人和洗衣机两个对象

    1. 人:打开洗衣机、放衣服、放洗衣液

    2. 洗衣机:洗涤、甩干

可见,面向过程比较直接高效,面向对象则更易于复用、拓展和维护。

2. 面向对象三大特性

  1. 封装 是一种对象功能内聚的表现形式,使模块之间耦合度变低,更具有 维护性
  2. 继承 使子类能继承父类,获得父类的部分属性和行为,使模块更有 复用性
  3. 多态 使模块在复用性基础上更加有 拓展性,使系统运行更有想象空间。

2.1 封装

访问控制权限 又称封装,核心是成员只对需要的类可见,即 内部细节对外部调用透明,外部调用无需修改或关心内部实现

Java 类与对象 的笔记中提到 Java 四种访问权限,分别是 public、protected、无、private。

典型例子如另一篇笔记 Java 方法与构造方法 中的 getter/setter 方法,属性为私有的 Java Bean 通过 getter/setter 方法访问或赋值属性,不能由外部直接访问或修改,体现了属性的安全性和面向对象的封装性。

《码出高效》中将封装描述为 “由俭入奢易,由奢入俭难”。相较于直接访问,若想在修改属性的 setter 方法上对属性进行加密、鉴权、日志记录等,间接访问更为合适。

1
2
3
4
5
6
private String id;

public void setId(String id) {
    // 设置 id 须经过 base64 加密
    this.id = Base64.getEncoder().encodeToString(id.getBytes());
}

又如 ORM(对象关系映射) 框架,它是通过使用描述对象和数据库之间映射的元数据,将对象自动持久化到数据库中,我们无需关心映射如何建立、SQL 语句如何执行,只需引入框架,调用 CRUD 接口方法即可。

2.2 继承

继承满足了复用的需求,子类继承父类,父类的能力赋予子类。子类引用代替父类引用,说明两个类符合 里氏代换原则(LSP),可以使用继承关系。

但是继承存在方法污染和方法爆炸的危害性(方法污染指子类不具备执行父类所具备的行为的能力,方法爆炸指经过多次继承造成方法过多而带来不便和隐患),所以一般提倡使用 组合或聚合 关系来复用其它类的能力。

2.3 多态

Java 继承与多态 中已描述了多态的定义和使用。《码出高效》认为,多态专指覆写(override)