当前位置:课程学习>>第四章 面向对象基础>>文本学习>>知识点一
一、面向对象程序设计的历史
面向对象程序设计(Object Oriented Programming,简称OOP)是一种全新的计算机编程架构,它的出现是以60年代的Simula语言为标志。到了80年代中后期,面向对象程序设计逐渐成熟,并被计算机界理解和接受。
1960年结构化程序设计思想诞生,如C语言和Pascal等语言。这种结构化分析与设计开发方法是一个线性过程,因此,它要求现实系统的业务管理规范,处理数据齐全,用户能全面完整地描述其业务需求。然而它却很难适应软件生产自动化的要求,因为它以过程为中心进行功能组合,软件的扩充和复用能力很差。为了解决这个问题,面向对象程序设计方法应运而生。
60年代产生了Simula语言,现在OOP的许多原始思想都来之于该语言,并在Smalltalk语言的完善和标准化过程中得到更多的扩展和重新注解。OOP倾向于建立一个对象模型,它能够近似的反映应用领域内实体之间的关系,其本质是更接近于一种人类认知事物所采用的一种计算模型。在OOP中,对象作为计算主体,拥有自己的名称,状态以及接受外界消息的接口。对象是对现实世界实体的模拟,因而能更容易地理解需求,即使用户和分析者之间具有不同的教育背景和工作特点,也可很好地沟通。OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。
未来的面向对象程序设计技术将会更多地使用泛型程序设计(Generic Programming,简称GP),通过GP构造出更多的通用性程序库,使得程序开发工作变得更简单。
二、面向对象程序设计的特点
相对于传统的面向过程的程序设计方法,面向对象的程序设计具有如下特点:
(1) 程序设计的重点在于数据而不再是过程,程序被划分为多个不同的对象来表示。
(2) 数据结构为表现对象的特性而设计;方法作为对某个对象数据的操作,与数据结构紧密的结合在一起。
(3) 数据被隐藏起来,不能为外部方法访问,对象的数据封装特性彻底消除了传统结构方法中数据与操作分离所带来的种种问题,提高了程序的可复用性和可维护性。
(4) 对象的数据封装特性还可把对象的私有数据和公共数据分离开,保护了私有数据,减少了可能的模块间干扰,达到降低程序复杂性、提高可控制性的目的。
(5) 对象之间可以通过方法沟通,通过一定的接口和相应的消息机制与外界相联系。
(6) 新的数据和方法可以在需要的时候轻而易举的添加进来,继承是面向对象方法中除封装外的另一个重要特性,通过继承可以很方便地实现应用的扩展和已有代码的重复使用。
综上所述,面向对象程序设计是将数据与操作封装在一起,成为一个不可分割的整体,同时将具有相同特征的对象抽象成为一种新的数据类型——类。通过对象间的消息传递使整个系统运转,通过对象类的继承提供代码复用。从程序执行这一角度来看,可以归结为各对象和它们之间的消息通信。
三、面向对象程序设计中的基本概念
1.对象(object)
这里的对象具有两个层次的含义,一是指客观世界中存在的实体,此时对象与实体是一一对应的,二是指程序中的对象,它是一组变量和相关方法的集合。我们可以将现实世界中具备某些共同特征的实体(对象)经过抽象,映射为程序中的对象,对象在程序中是通过一种抽象数据类型来描述的,这种抽象数据类型就称为类(class)。
对象是对现实实体的抽象,一个对象可被认为是一个把数据(属性)和程序(方法)封装在一起的实体。类用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
对象的产生有三种基本方式。一种是以原型(prototype)对象为基础产生新的对象,一种是以类(class)为基础产生新对象,另外一种就是元类(metaclass)的对象模型。原型模型就是企图通过提供一个有代表性的对象为基础来产生各种新的对象,并由此继续产生更符合实际应用的对象。而类则提供了一个或者多个对象的通用性描叙。从形式化的观点看,类与类型有关,因此一个类相当于是从该类中产生的实例的集合。而在类模型基础上还诞生出了一种拥有元类的新对象模型,即类本身也是一种其他类的对象。以上三种根本不同的观点各自定义了基于类(class-based),基于原型(prototype-based)和基于元类(metaclass-based)的三种对象模型。从而导致了许多不同的程序设计语言,C++、Java都是使用基于类的对象模型。
2.抽象(abstract)
抽象指仅表现核心的特性而不描述背景细节的行为,它是一种思维形式,就是抽取出事物的共同点,以统一的方式进行概要描述的一种过程。类就使用了抽象的概念,并且被定义为一系列抽象的属性如尺寸、重量和价格,以及操作这些属性的函数。这种程序设计方法可以大大提高程序的重用性。不同的层次的抽象,其结果也会有所不同。例如:对于轿车、卡车、公交车等对象,我们可以把它们抽象为汽车类,而对于火车、轮船、飞机以及汽车这些对象,我们又可以抽象为交通工具类,这里的汽车在前者是抽象后的类,而在后者却是被当作具体的对象。
3.成员(field)与方法(method)
抽象为一个类的不同对象具有许多相同的特点,这些特点基本上可以分为两大类,一是描述对象的静态状态,这就是对象的属性或状态,在程序设计中称之为变量(variable)或成员(field),另一个就是描述对象的动作和行为的,这就是程序中的函数或方法(method),例如,汽车的属性就有颜色、功率、位置、速度、重量等,具有的方法有前进、后退、加速、减速等。
4.封装(encapsulation)
通过把对象的数据和方法组合在一个类中,定义如何引用对象的数据,使用方法将类中的成员隐藏起来,控制用户对成员的修改和访问程度,这就是封装。数据封装是类的最典型特点。数据不能被外界访问,只能被封装在同一个类中的方法访问,这些方法提供了对象数据和程序之间的接口。封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。简单的说,一个对象就是一个封装了数据和操作这些数据的代码的逻辑实体。
在一个对象内部,某些代码和某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。如图4.1所示封装实现了私有数据的保护。
图4.1 封装实现了私有数据的保护
5. 继承(inheritance)
继承是可以让某个类型的对象获得另一个类型的对象的属性和方法。每一个子类都继承了父类的公共特性。OOP中,继承的概念很好的支持了代码的重用性,也就是说,我们可以向一个已经存在的类中添加新的成员,而不必改变这个类。只需要通过从这个已存在的类派生一个新类来实现。这个新的类将继承原有类的特性,以及新的特性。而继承机制的魅力和强大就在于它允许程序员利用已经存在的类(接近需要,而不是完全符合需要的类),并且可以以某种方式修改这个类,而不会影响其它的东西。
6. 多态(polymorphism)
多态是OOP的另一个重要概念,它使是事物具有不同形式的能力。举个例子,对于不同的实例,某个操作可能会有不同的行为。这个行为依赖于所要操作数据的类型。比如说加法操作,如果操作的数据是数,它对两个数求和。如果操作的数据是字符串,则它将连接两个字符串。