
1.3 面向对象程序设计的基本概念
1.3.1 面向对象方法
面向对象(Object-Oriented,OO)方法是一种把面向对象的思想应用于软件开发过程中并指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。对象是由数据和允许的操作组成的封装体,与客观实体有直接的对应关系,一个对象类定义了具有相似性质的一组对象。而继承性是对具有层次关系的类的属性和操作进行共享的一种方式。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。
1967年,挪威计算中心的Kristen Nygaard和Ole-Johan Dahl开发了Simula67语言,它提供了比子程序更高一级的抽象和封装,引入了数据抽象和类的概念,它被认为是第一个面向对象语言。

图1-1 语言的发展
20世纪70年代初,Palo Alto研究中心的Alan Kay所在的研究小组开发出Smalltalk语言,之后又开发出Smalltalk-80,Smalltalk-80被认为是最纯正的面向对象语言,它对后来出现的面向对象语言,如Object-C、C++、Self、Eiffel都产生了深远的影响。随着面向对象语言的出现,面向对象程序设计也就应运而生,并且得到迅速发展。之后,面向对象不断向其他阶段渗透,1980年Grady Booch提出了面向对象设计的概念,之后又开始面向对象分析。1985年,第一个商用面向对象数据库问世。1990年以来,面向对象分析、测试、度量和管理等研究都得到了长足发展。实际上,“对象”和“对象的属性”这样的概念可以追溯到20世纪50年代初,它们首先出现于关于人工智能的早期著作中。但是出现了面向对象语言之后,面向对象思想才得以迅速发展。过去的几十年中,程序设计语言对抽象机制的支持程度不断提高:从机器语言到汇编语言,再到结构化程序设计语言(高级语言),直到面向对象程序设计语言,如图1-1所示。汇编语言出现后,程序员就避免了直接使用0和1编码,而是利用符号来表示机器指令,从而更方便地编写程序;当程序规模继续增长的时候,出现了FORTRAN、C、Pascal等高级语言,这些高级语言使得编写复杂的程序变得容易,程序员可以更好地对付日益增加的复杂性。但是,如果软件系统达到一定规模,即使应用结构化程序设计方法,局势仍将变得不可控制。作为一种降低复杂性的工具,面向对象语言产生了,面向对象程序设计也随之产生。
1.3.2 面向对象的基本概念与特征
面向对象的概念可以使得按照人们通常的思维方式来建立问题域的模型,设计出尽可能自然地表现求解方法的软件。早期提出的“面向对象”,是专指在程序设计中采用封装、继承、抽象等设计方法。实际上,面向对象的思想已经涉及软件开发的各个方面,例如面向对象的分析(Object Oriented Analysis,OOA)、面向对象的设计(Object Oriented Design,OOD)以及面向对象的编程实现(Object Oriented Programming,OOP)。
1. 对象
对象是要研究的任何事物。从一本书到一家图书馆,从单个整数到整数列庞大的数据库,以及极其复杂的自动化工厂、航天飞机,都可看作对象,对象不仅能表示有形的实体,也能表示无形的(抽象的)规则、计划或事件,对象由数据(描述事物的属性)和作用于数据的操作(体现事物的行为)构成一个独立整体。从程序设计者角度来看,对象是一个程序模块;从用户角度来看,对象为他们提供所希望的行为,这些操作通常称为方法。
2. 类
类是对象的模板。也就是说,类是对一组有相同数据和相同操作的对象的定义,一个类所包含的数据和方法描述一组对象的共同属性和行为。类是在对象之上的抽象;对象则是类的具体化,是类的实例。类可有其子类,也可有其他类,形成类层次结构。
3. 消息
消息是对象之间进行通信的一种规格说明。一般它由3个部分组成:接收消息的对象、消息名及实际变元。
4. 面向对象主要特征
1)封装性
封装是一种信息隐蔽技术,它体现于类的说明,使数据更安全,是对象的重要特性。封装使数据和加工该数据的方法(函数)封装为一个整体,以实现独立性很强的模块,使得用户只能见到对象的外特性(对象能接收哪些消息,具有哪些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者和使用者分开,对象的使用者不必知晓行为实现的细节,只须用对象的设计者提供的消息来访问该对象。
2)继承性
继承性是子类自动共享父类之间数据和方法的机制。它由类的派生功能体现。一个类直接继承其他类的全部描述,同时可修改和扩充。继承具有传递性和单根性,如果B类继承了A类,而C类又继承了B类,则可以说,C类在继承了B类的同时也继承了A类,C类中的对象可以实现A类中的方法。一个类,只能够同时继承另外一个类,而不能同时继承多个类,通常所说的多继承是指一个类在继承其父类的同时,实现其他接口。类的对象是各自封闭的,如果没有继承性机制,则类对象中数据、方法就会出现大量重复。继承支持系统的可重用性,从而达到减少代码量的作用,而且还促进系统的可扩充性。
3)多态性
对象根据所接收的消息而做出动作。同一消息为不同的对象接收时可产生完全不同的行动,这种现象称为多态性。利用多态性用户可发送一个通用的信息,而将所有的实现细节都留给接收消息的对象自行决定,如果是,则同一消息即可调用不同的方法。多态性的实现受到继承性的支持,利用类继承的层次关系,把具有通用功能的协议存放在类层次中尽可能高的地方,而将实现这一功能的不同方法置于较低层次,这样在这些低层次上生成的对象就能给通用消息以不同的响应。在OOP中可以通过在派生类中重定义基类函数(定义为虚函数)来实现多态性。
综上可知,在面向对象方法中,对象和传递消息分别表示事物及事物间相互联系的概念。类和继承只是适应人们一般思维方式的描述范式。方法是允许作用于该类对象上的各种操作。这种对象、类、消息和方法的程序设计范式的基本点,在于对象的封装性和类的继承性。通过封装能将对象的定义和对象的实现分开,通过继承能体现类与类之间的关系,以及由此带来的动态联编和实体的多态性,从而构成面向对象的基本特征。面向对象是当前计算机界关心的重点,它是20世纪90年代软件开发方法的主流。面向对象的概念和应用已经超越了程序设计和软件开发,扩展到很宽的范围。例如,数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。这里介绍了面向对象的简单概念,Java语言是典型的面向对象语言,关于面向对象的一些内容将在后面的章节中详细介绍。