面向对象语言有三大特性:封装、继承、多态。
封装
从表面上理解:
封装就是将相互关联的数据和函数整合到一起,形成类。并通过访问修饰符,对外提供可以直接使用的字段和方法(数据和函数)。从而实现类的内部与外部间的高内聚、松耦合。
而从更深的角度上理解:
封装其实是封装变换点(面向对象原则),将稳定的部分与变化的部分相互分离,从而使得变化部分进行变化的时候不会对外界产生不良的影响。
继承
继承就是从已有的类中派生出它的子类,使得子类中包含父类中的字段和方法。
虽然继承是面向对象语言的一大特性,但是继承本身的特点使得继承状态下的父类会暴露非常多的信息给子类,导致父类与子类间的紧耦合。因此根据合成复用原则(面向对象原则),我们应该多用组合少用继承。
多态
多态又分为两种:编译时多态、运行时多态。
编译时多态:
编译时多态会在编译阶段确定好代码中的调用关系。我们使用的泛型,就是一种编译时多态技术。
运行时多态:
在程序运行的时候才会确定代码中的调用关系。我们使用的函数重载、虚函数的多态调用就是一种运行时多态。
就性能而言,由于编译时多态在编译阶段就已经确定好了调用关系,所以它在程序运行的时候能够直接的调用到对应的方法。而运行时多态,由于运行前不知道调用关系,所以它在程序运行的过程中会有一个查询(方法表)过程。因此编译时多态的性能会胜于运行时多态。