面对对象
是什么?
面向对象是一种软件设计思想和编程范式:把程序要处理的事物抽象成“对象”,用对象来封装数据和行为,然后通过对象之间的协作来完成业务功能。
为什么?
面向对象(OOP)的出现是为了应对大规模、复杂软件开发的维护、扩展和复用难题,解决面向过程在处理复杂业务时代码耦合度高、难以维护的瓶颈。
- 应对复杂性与维护危机:随着软件规模增大,面向过程代码逻辑混杂,修改一处往往影响全身。面向对象通过封装,使代码模块化,将复杂问题分解为多个独立的对象,降低了维护成本。
- 符合人类思维方式:面向过程强调“怎么做”(步骤),而面向对象强调“谁来做”(对象)。它将客观世界的事物(如“用户”、“订单”)映射为程序中的对象,降低了程序设计与现实世界的理解鸿沟。
- 代码的高复用与易扩展:通过继承和多态机制,代码可以被方便地重用,同时也更易于通过新增类来扩展系统功能,而无需修改原有的、已稳定的代码。
- 高内聚低耦合:面向对象将数据和方法封装在对象内部(高内聚),对象之间通过明确定义的接口进行通信,降低了各功能模块之间的依赖关系(低耦合)。
三大特性
封装
利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体。数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保留一些对外接口使之与外部发生联系。用户无需知道对象内部的细节,但可以通过对象对外提供的接口来访问该对象。
- 只暴露出需要暴露的能力,外部也不需要关注内部细节,只关注怎么调用,得到了什么,粗暴的理解就是:你网上缴纳话费,不关系费用内部怎么流转,怎么统计,你只管输入号码和金额,完成支付,等待到账。
- 减少耦合:模块之间相对独立,有明确的边界。
继承
继承实现了 IS-A 关系,例如 Cat 和 Animal 就是一种 IS-A 关系,因此 Cat 可以继承自 Animal,从而获得 Animal 非 private 的属性和方法。继承应该遵循里氏替换原则,子类对象必须能够替换掉所有父类对象。Cat 可以当做 Animal 来使用,也就是说可以使用 Animal 引用 Cat 对象。父类引用指向子类对象称为 向上转型 。
- 复用代码,建立层次结构。
根据对象的细微差异,抽象出同一动作的不同实现,而调用方则不用依赖具体的实现,即可完成自己的流程步骤,只需要替换流程节点中的具体实现子类,Java中基于 (@Overriding)
基类和子类的耦合度很高。
多态
多态分为编译时多态和运行时多态:
- 编译时多态主要指方法的重载(@Overload)
- 运行时多态指程序中定义的对象引用所指向的具体类型在运行期间才确定
- 运行时多态有三个条件:
- 继承
- 覆盖(重写)
- 向上转型
动态绑定是指编译器在编译阶段不知道要调用哪个方法,直到运行时才能确定。Java中除了static方法和final方法之外,其他所有方法都是后期绑定。