一、 面向对象程序设计简介
面向对象是一种更优秀的程序设计方法,他的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。它从现实世界中客观存在的事物(即对象)出发来构造软件系统,并且在系统构造中尽可能运用人类的自然思维方式,强调直接以实现世界中的事物(及对象)为中心来思考,认识问题。并且根据这些事物的本质特点,把他们抽象的表示为系统中的类,作为系统的基本构成单元(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的过程来构造系统),这使得软件系统的组件可以直接映像到客观世界,并保持客观世界中事物及其相互关系的本来面貌。
采用面向对象方式开发的软件系统,其最小的程序单元是类,这些类可以生成系统中的多个对象,而这些对象则直接映像成客观世界的各种事物。
面向对象的软件系统由多个类组成,类代表了客观世界中具有某种特征的一类事物,这类事物往往有一些内部的状态数据,比如人的身高、体重、年龄、爱好等各种状态数据——当程序没有必要记录该事物所有的状态数据,程序只要记录业务关心的状态数据即可。
面向对象的语言不仅使用类来封装一类事物的内部状态数据,这种数据就对应成员变量,而且类会提供操作这些状态数据的方法,还会为这类事物的行为特征提供相应的实现,这种实现也是方法。因此可以得到如下的基本公式:
成员变量(状态数据)+方法(行为)=类定义
从这个等式看,面向对象过程的编程粒度要大:面向对象的程序单位是类:而面向过程程序单位是函数(相当于方法),因此面向对象比面向过程更简单、易用。
从面向对象的眼光来看,开发者希望从自然的认识、使用角度来定义和使用类。
也就是说,开发者希望直接对客观世界进行模拟:定义一个类,对应客观世界的那种事物:业务需要关心这个事物的那些状态,程序就为这些状态定义成员变量;业务需要关心这个事物的那些行为,程序就为这些行为定义方法。
不仅如此,面向对象程序设计与人类习惯的思维方法有比较好的一致性,比如希望完成“猪八戒吃西瓜“这样一件事情。
在面向过程的程序世界里,一切以函数为中心,函数最大,因此这件事情会用如下语句来表达;
吃(猪八戒,西瓜);
在面向对象的程序世界里,一切以对象为中心,对象最大,因此这件事情会用如下语句来表达:
猪八戒.吃(西瓜);
不难发现,面向对象的语句更接近自然语言的语法:主语、谓语、宾语一目了然。十分直观。因此程序员更容易理解。
二、 面向对象的基本特征
面向对象方法具有三个基本特征:封装、继承、和多态,其中封装指的是将对象的细节隐藏起来,然后通过一些公用的方法来暴漏该对象的功能;继承是面向对象实现软件复用的重要手段,当子类继承父类,将直接获取父类的属性和方法;多态指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征,这意味着同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。
除此之外,抽象也是面向对象的重要部分抽象就是忽略一个主题中与当前目标无关的那些方面,以便充分的注意与当前目标有关的方面。抽象并不打算了解全部问题,而是只是考虑部分问题。例如:需要考察person对象时,不可能在程序中把person的所有细节都定义出来,通常只能定义person的部分数据、部分行为特征——而这些数据、行为特征是软件系统所关心的部分。
面向对象还支持如下几个功能
对象是面向对象方法中的最基本的概念,它的基本特点有:表识唯一性、分类性、多态性、封装性、模块独立性好。
类是具有共同属性、共同方法的一类事物。类是对象的抽象,对象则是类的实例,而类是整个软件系统最小的程序单元,类的封装性将各种信息细节隐藏起来,并通过公用的方法来暴漏该类对外所提供的功能,从而提高了类的内聚性,降低了对象之间的耦合性。
对象间的这种相互合作需要一个机制协助进行,这样的机制称为“消息”。消息是一个实例与另一个实例之间相互通信的机制。
在面向对象方法中,类之间共享属性和操作的机制称为继承,继承具有传递性。继承可以分为单继承(一个继承只允许有一个直接父类,即类等级为树形结构)与多继承(一个类允许有多个直接父类)。由于多继承会大大降低程序的可理解性,所以Java不支持多继承。
在编程语言领域,还有一个“基于对象”的概念,这两个概念容易混淆,通常而言,“基于对象”也使用了对象,但是无法利用现有的对象模板产生新的对象类型,继而产生新的对象,也就是说,“基于对象”没有继承的特点;而“多态”则更需要继承,没有了继承的概念也就无从谈论多态。面向对象方法的三大基本特征缺一不可。例如,JavaScript语言就是基于对象的,它使用一些封装好的对象,调用对象的方法,设置对象的属性:但是他们无法让开发者派生新的类,开发者只能使用现有对象的方法和属性。
判断一门语言是否是面向对象的,通常可以使用继承和多态来加以判断。“面向对象”和“基于对象”都实现了“封装”的概念,但是面向对象实现了继承和多态,而基于对象没有实现这些。
面向对象编程的程序员按照分工为“类库的创建者”和“类库的使用者”,使用类库的人并不都是具备了面向对象思想的人,通常知道如何派生新对象就可以使用类库了,然而他们的思维并没有真正的转过来,使用类库只是形式上是面向对象的,而实质上只是库函数的一种扩展。