面向对象
- 面向对象编程
(Object Oriented Programming OOP)
是一种编程范式或编程风格。它以类或对象作为组织代码的基本单元,并将封装、抽象、继承、多态四个特性,作为代码设计和实现的基石 。
面向对象编程中有两个非常重要、非常基础的概念,那就是类(class)和对象(object)。
- 面向对象编程语言
(Object Oriented Programming Language OOPL)
是支持类或对象的语法机制,并有现成的语法机制,能方便地实现面向对象编程四大特性(封装、抽象、继承、多态)的编程语言。
- 封装(Encapsulation)
What:隐藏信息,保护数据访问。
How:类通过暴露有限的访问接口,授权外部仅能通过类提供的方式来访问内部信息或者数据。它需要编程语言提供权限访问控制语法来支持,例如 Java 中的 private、protected、public 关键字。
Why:保护数据不被随意修改,提高代码可维护性;降低接口复杂度,提高类的易用性。
- 抽象(Abstraction)
What:隐藏具体实现,使用者只需关心功能,无需关心实现。
How:通过接口类或者抽象类实现,特殊语法机制非必须。
Why:提高代码的扩展性、维护性;降低复杂度,减少细节负担。
- 继承(Inheritance)
What:表示 is-a 关系,分为单继承和多继承。
How:需要编程语言提供特殊语法机制。例如 Java 的 extends,C++ 的 : 。
Why:解决代码复用问题。
- 多态(Polymorphism)
What:子类替换父类,在运行时调用子类的实现。
How:需要编程语言提供特殊的语法机制。比如继承、接口类、duck-typing。
Why:提高代码扩展性和复用性。
面向过程
面向对象编程以类为组织代码的基本单元,而面向过程编程也是一种编程范式或编程风格。它以过程(可以理解为方法、函数、操作)作为组织代码的基本单元,以数据(可以理解为成员变量、属性)与方法相分离为最主要的特点。面向过程风格是一种流程化的编程风格,通过拼接一组顺序执行的方法来操作数据完成一项功能。
面向对象编程相比面向过程编程有哪些优势?
为什么面向对象编程晚于面向过程编程出现,却能取而代之,成为现在主流的编程范式?面向对象编程跟面向过程编程比起来,到底有哪些优势?
- 对于大规模复杂程序的开发,程序的处理流程并非单一的一条主线,而是错综复杂的网状结构。面向对象编程比起面向过程编程,更能应对这种复杂类型的程序开发。
- 面向对象编程相比面向过程编程,具有更加丰富的特性(封装、抽象、继承、多态)。利用这些特性编写出来的代码,更加易扩展、易复用、易维护。
- 从编程语言跟机器打交道的方式的演进规律中,我们可以总结出:面向对象编程语言比起面向过程编程语言,更加人性化、更加高级、更加智能。
抽象类和接口
- 定义
抽象类:不允许实例化,只能被继承;可包含属性和方法,包含抽象方法;子类继承抽象类必须重写抽象方法。
接口:不允许实例化,只能被实现;不包含属性和普通方法,包含抽象方法、静态方法、default 方法,枚举类型,接口中还可以定义接口(嵌套);类实现接口时,必须实现抽象方法。
- 意义
抽象类:解决复用问题,适用于 is-a 的关系。
接口:表示具有某一组行为特性,是为了解决解耦问题,隔离接口和具体的实现,提高代码的扩展性,适用于 has-a 的关系。
- 应用
什么时候该用抽象类?什么时候该用接口?为了解决代码复用问题,我们就用抽象类;为了解决抽象而非代码复用问题,那我们就用接口。







