OOP的特性主要有:1、封装;2、继承;3、多态。下面从这几个方面具体阐述。
1、封装
封装能将类的具体信息隐藏起来,使得数据得到保护。其具体实施主要是依靠访问控制机制权限,其权限主要有四种:1、private;2、default(C++没有这种权限);3、protected;4、public。在这四种权限下的数据在外界的可见性不同。Private只在类的内部可见,其子类亦不可见;default的可见范围扩展到同一个包内;protected在类的内部、同个包、其子类内部可见;public不对外界隐藏。
声明为private的变量为类内部可见,并非对象级别的内部可见,即在类的实例内可以引用同类型的另一实例的private变量。
封装将数据安全的保护起来,外界欲访问数据必须通过类设计的接口,类的设计对于数据的安全和类的功能有重要作用。
2、继承
继承是OPP的另一个大的特点,继承免去了重复开发类似的代码所带来的繁琐,节省了重复开发的开销,但由于现实中各种对象的复杂性和原来开发的类所描述的对象特性可能不够准确、不够全面,继承也面临很多困难。如某个对象的特性可能是某个类所描述的特性的一个子集,若以该类去描述这个对象,这就可能造成内存的浪费。某个对象可能主要由某个类描述但同时又有其它类的特性,C++可以多重继承,即某个类可以同时继承其它几个类的特性,但这可能带来冲突、浪费。Java只支持单继承(extends),即类只可以有一个父类,对于多重继承问题其使用了接口(implements)。接口其实是一种描述某种行为特性的方法声明,其并没有方法体,要求在实现了其接口的类中描写。
当父类描述的特性并不是非常符合子类的要求时,我们必须重新描写这些方法体,这就是重写(覆盖)。即子类中的同名(参数等相同)函数覆盖了父类的函数。
3、多态
多态分为两种:编译时的多态和运行时的多态。这两种的实现机制不同,编译时的多态利用函数的重载机制,即相同的函数名不同的参数(包括参数的类型、个数)的函数组成一个有实际意义的方法体系列,具体调用时根据传递进去的参数选择不同的函数。由于在编译时就可以根据参数列表确定具体的函数,故称为编译时的多态,亦称为早联编。
运行时的多态:编译时不知道需要调用哪个具体的函数,在运行时方能确定。为解释运行时多态,必须阐述一下上溯造型,由于子类继承了父类的数据和方法体,而且拥有自己的特性,即父类是子类的一个子集。这样父类所描述的行为特性子类亦有,这样子类的对象引用可以转化为父类的对象引用。当同个父类的一组子类对象调用重写父类的同名函数时,可以利用父类的引用发出调用指令。由于父类对象引用可能是不同子类的对象转换过来的,其调用的具体函数实现不同,这样就实现了用一个对象引用调用一组同名函数,在不同的情况下实现不同的行为。