面向对象技术概述.docx

上传人:b****5 文档编号:3576803 上传时间:2022-11-24 格式:DOCX 页数:11 大小:114.10KB
下载 相关 举报
面向对象技术概述.docx_第1页
第1页 / 共11页
面向对象技术概述.docx_第2页
第2页 / 共11页
面向对象技术概述.docx_第3页
第3页 / 共11页
面向对象技术概述.docx_第4页
第4页 / 共11页
面向对象技术概述.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

面向对象技术概述.docx

《面向对象技术概述.docx》由会员分享,可在线阅读,更多相关《面向对象技术概述.docx(11页珍藏版)》请在冰豆网上搜索。

面向对象技术概述.docx

面向对象技术概述

第1章面向对象技术概述

本章综述

面对各种亟待解决的问题,人们都要有解决的步骤和方法。

如何把这些步骤和方法准确无误地告诉给计算机,并且让计算机帮助人们来解决问题,这是程序设计的任务。

人与计算机之间通过计算机程序设计语言进行交互。

计算机程序设计语言经历了侧重计算机理解逐步过渡到面向人们理解的发展过程,Java语言是一种成熟的、面向对象的、更符合人们思考习惯的计算机编程语言。

本章从面向对象技术的发展历史入手,引导读者分析客观世界的问题域中的对象,从而理解面向对象程序设计的基本思想和基本概念,理解面向对象的程序设计与结构化程序设计的不同,了解常用面向对象编程语言以及通用建模语言(UML)描述。

本章的重点内容包括:

∙面向对象的基本概念;

∙面向对象技术的基本特征;

∙面向对象程序设计方法;

∙面向对象的UML描述。

1.1面向对象技术的发展

面向对象技术源于面向对象的编程语言(objectorientedprogramminglanguage,

OOPL)。

从20世纪60年代提出面向对象的概念到现在,它已发展成为一种比较成熟的编程思想,并且逐步成为目前软件开发领域的主流技术。

面向对象并非是一个新的概念,寻其根源可以追溯到20世纪60年代的挪威,当时挪威计算中心的KristenNygaard和Ole-JohanDahl开发了一种称作Simula67的仿真语言,该语言中引入了类的概念和继承机制,后来一些著名的面向对象编程语言都受到Simula的启发,如Smalltalk、C++、Eiffel。

在20世纪70年代中期,AlanKay在施乐公司设计开发了Smalltalk语言,它具备了面向对象语言的继承和封装的主要特征,使面向对象程序设计方法趋于完善,掀起了面向对象研究的高潮。

该语言的每个元素都被作为一个对象来实现。

Smalltalk的程序设计环境及其相关的各方面都是面向对象的。

即使今天,Smalltalk仍被认为是最纯的面向对象语言。

Simula67和Smalltalk的开发为今天的面向对象研究开发工作奠定了基础。

从20世纪80年代中期到90年代,大批比较实用的面向对象编程语言涌现出来,如C++、Objective-C、ObjectPascal等。

面向对象编程语言的繁荣是面向对象技术走向实用的重要标志,也是面向对象技术在计算机学术界、产业界和教育界日益受到重视的结果。

在C++语言十分热门的时候,人们开始了对面向对象分析(objectorientedanalysis,OOA)的研究,进而延伸到面向对象设计(objectorienteddesign,OOD)。

特别是20世纪90年代以后,许多专家都在尝试用不同的方法进行面向对象的分析与设计,在这段时期,面向对象的分析和设计技术逐渐走向实用,最终形成了从分析、设计到编程、测试与维护一整套的软件工程体系。

当前,面向对象的概念已经渗透到编程语言、用户接口、人工智能和数据库等方面。

1.2面向对象方法与结构化方法的比较

为了更好地理解面向对象方法与结构化方法的不同,下面通过对一个实例的分析来认识这个问题。

1.2.1现实问题分析

【例1-1】某校需要设计图书管理系统,要求该系统具有借阅、归还、预订、查询等基本功能,其功能要求如下:

(1)借阅:

图书管理员输入读者借书证号码,系统首先检查借书证是否有效,若有效,则检查该读者所借图书或杂志是否超过10本,若已达到10本,则拒借;若未达到10本,则办理借书手续,修改图书库存目录并将读者借书情况保存到借书文件。

(2)归还:

图书管理员通过系统从借书文件中读出与读者有关的记录,查阅所借日期,如超期(3个月)作罚款处理。

否则,修改相应图书库存目录与借书文件。

(3)预定:

借书者可以预定目前借不到的书或杂志,一旦预定的书被其他人返还,就通知预定者。

(4)查询:

通过借书文件、图书库存目录文件查询读者情况﹑图书借阅及库存情况,打印统计表。

分析:

按照结构化方法的思路,采用“自顶向下、逐步求精”的方法,可以把问题描述中的系统分解为一系列的模块,如图1-1所示。

结构化方法强调功能抽象与模块化,因而结构化方法把问题看作一系列处理的过程,也就是以模块(即过程)为中心的开发方法。

图1-1“图书管理系统”结构化方法的功能图

然后对每个模块再按相同的方法进行分解,例如还书处理模块可进一步分解为下面的子模块,如图1-2所示。

借书处理模块也可以进一步分解为相应子模块,如图1-3所示。

图1-2“还书处理”模块图1-3“借书处理”模块

按照面向对象方法来分析本系统则不是从功能入手,而是从对象入手。

待解决的问题所涉及的业务范围称为该软件的问题域(problemdomain)。

面向对象方法从问题域中的事物出发,围绕问题域中的事物来思考问题、认识问题,并根据这些事物的本质特征,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。

这可以使系统直接地映射问题域。

对于图书管理系统,首先可以识别出一些直接的对象,包括图书、杂志、借阅者、图书管理员,还需要一个实体对象来记录图书的借还信息。

到这一步,基本完成了实体对象的识别。

另外,还需要一个借书的控制类来执行借书的动作。

这样,初步的对象模型就可以建立了,如图1-4所示。

图1-4图书管理系统中的“对象”及关系

说明:

在这个问题中,如果借书功能有变动,要求借阅前登记借阅者详细信息,如爱好、专长、借阅图书类型倾向等,两种设计方法的修改不同。

如果采用面向过程方法设计,则要修改程序(借书模块)。

如果采用面向对象方法设计,则只需要在借还控制类中增加一个方法,整个系统功能图不发生改变。

从这个例子可以看出,面向对象方法与结构化方法相比较而言,它以数据为中心而不是以功能为中心来描述系统,而数据相对于功能而言具有更强的稳定性,通常而言,以面向对象方法开发的系统的可维护性更好。

1.2.2面向对象方法的优越性

以对象为中心的开发方法比以功能为中心的开发方法优越,它将客观世界直接映射到面向对象程序空间,程序结构清晰、简单,提高了代码的重用性,有效地减少了程序的维护量,提高了软件的开发效率。

具体表现在如下几个方面:

(1)以对象为中心的开发方法能更自然更直接地反映真实世界的问题空间,对象、类、子类都自然对应于实际问题的物理或逻辑实体,这样使问题转换工作量达到最小程度。

事实上,采用面向对象方法较之结构化方法在编程量方面可降低40%~90%。

(2)以对象为中心的开发方法采用消息传递机制作为对象之间相互通信的唯一方式。

对象本身具有很强的自治性和独立性,接收消息的对象有权负责响应与处理所收到的消息,按消息名激活本对象内相应的操作(称为方法)并执行该操作,返回适当的结果。

发送消息的对象还可将同一条消息同时发送至多个接收消息的对象中,并允许这些接收同一条消息的对象按照自身的适当方式加以响应。

这样就使消息传递的机制能很自然地与分布式并行程序、多机系统、网络通信等模型取得一致,从而强有力地支持复杂大系统的分析与运行。

(3)以对象为中心的开发方法具有独特的继承性和更丰富的多态性,使这种开发方法更易于扩充,能很好地适应复杂大系统不断发展与变化的要求。

在结构上,面向对象程序与面向过程程序有很大不同。

面向对象程序由类的定义和类的使用两部分组成:

在主程序中定义各对象并规定它们之间传递消息的规律,程序中的一切操作都是通过向对象发送消息来实现;对象接到消息后,启动消息处理函数完成相应的操作。

1.2.3面向对象与面向过程的不同

面向对象方法与结构化方法相比较,主要有以下不同:

(1)它以数据为中心而不是以功能为中心来描述系统,数据相对于功能而言具有更高的稳定性。

(2)它将数据和对数据的操作封装在一起,作为一个整体来处理,采用数据抽象和信息隐藏技术,将这个整体抽象成一种新的数据类型——类,并且考虑不同类之间的联系和类的重用性。

类的集成度越高,就越适合大型应用程序的开发。

(3)面向对象程序的控制流程由运行时各种事件的实际发生来触发,而不再由预定顺序来决定,更符合实际。

事件驱动程序的执行围绕消息的产生与处理,靠消息循环机制来实现。

(4)它可以利用不断扩充的类库,在实际编程时采用搭积木的方式来组织程序,站在“巨人”的肩上实现自己的目标。

1.2.4面向对象技术的基本观点

如果说传统的面向过程的编程是符合机器运行指令的流程的话,那么面向对象的思维方法就是符合现实生活中人类解决问题的思维过程。

把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程,在这个翻译的过程中,软件也就逐步被设计好了。

总结起来,面向对象技术的基本观点如下:

(1)客观世界是由对象组成,任何客观的事物或实体都是对象,复杂的对象可以由简单的对象组成。

(2)具有相同数据和相同操作的对象可以归并为一个类,对象是对象类的一个实例。

(3)类可以派生出子类,子类继承父类(或超类)的全部特性(数据和操作),又可以有自己的新特性。

子类与父类形成类的层次结构。

(4)对象之间通过消息传递相互联系。

类具有封装性,其数据和操作等对外界是不可见的,外界只能通过消息请求进行某些操作,提供所需要的服务。

1.3面向对象技术的基本概念

面向对象的精髓在于考虑问题的思路是从现实世界的人类思维习惯出发的。

下面从实际问题出发来了解面向对象的思维方法,认识面向对象方法中的基本概念,如对象、类、消息、事件等。

类与对象是面向对象程序设计中最基本且最重要的两个概念,有必要仔细理解和彻底掌握。

它们将贯穿全书并且逐步深化。

1.3.1对象和类

面向对象方法认为,客观世界由对象组成,任何客观的事物或实体都是对象,复杂的对象可以由简单的对象组成。

因此,对象是理解面向对象技术的关键。

1.什么是对象(object)

对象是人们要进行研究(感兴趣)的任何事物,从最简单的整数到航天飞机都可以看成对象。

从一般意义上讲,对象是现实世界中的一个实际存在的事物,它可以是有形的,如狗、自行车、房屋等,也可以是无形的,如国家、生产计划等。

现实世界中的对象有两个共同特征:

状态和行为。

比如狗有自己的状态(如名字、颜色)和行为(如摇尾巴)。

同样变速自行车也有自己的状态(如当前速度、当前档位)和行为(如向前行驶、向左拐弯、向右拐弯、刹车、加速、减速以及改变档位等等)。

在软件系统中,对象是用来描述客观事物的一个实体,它是构成系统的一个基本单位,由一组属性和对这组属性进行操作的一组方法组成。

属性是用来描述对象静态特征(即状态)的一个数据项;方法是用来描述对象动态特征(即行为)的一个操作序列。

对于图书管理系统,我们可以考虑进一步识别出类的一些属性和方法。

为了避免过早的陷入细节中,以及适应将来在设计时类的变化,在分析时,一般只把一些主要的属性和方法标识出来。

例如,对于借阅者类,需要姓名。

借书证号等重要属性,对于图书类,需要书号、书名、作者、出版社、出版时间、价格等属性。

此外,每个类可以根据其应该负担的职责来分析它应该提供的方法,如图1-5所示。

另外,自行车对象通过自行车类来抽象描述,如图1-6所示。

图1-5借阅者对象和图书对象的类描述图1-6自行车对象的类描述

说明:

(1)对象实现了数据与操作结合。

对象的状态通常用数据来描述,对象的操作就是对

象的行为,用来改变对象的状态。

为此,改变了传统方法中将数据与操作相分离的做法,

实现了将数据与操作封装在对象的统一体中。

(2)对象具有唯一识别的功能。

即使完全一样的茶杯也是两个对象,也有甲、乙之分。

(3)对象有自己内部的和对外部的行为,称为操作或方法。

(4)对象可以通过消息启动它的行为。

总之,对象是现实世界中可以区分的一个事物,它有独立性又有相关性。

如例1-1中的图书、借阅者、图书管理员等。

2.什么是类(class)

在现实世界中,经常看到相同类型的许多对象。

比如,你的自行车只是现实世界中许多自行车的其中一辆。

面向对象观点认为,你的自行车是自行车类的一个实例。

通常,自行车都有一些状态(当前档位、两个轮子等)以及行为(改变档位、刹车等)。

但是,每辆自行车的状态都是独立的并且跟其他自行车不同。

当厂家制造自行车的时候,利用自行车共有的特性设计蓝图来制造许多自行车。

如果制造一辆自行车就设计一个新蓝图,则效率太低。

由于各辆自行车都共有某些状态和行为,因此,在面向对象程序中,将所有自行车抽象为类的形式来定义,然后通过实例化,定义具体的一辆自行车,使得它具有自己的当前档位、当前速度等等。

不仅如此,这个类还为对象(自行车)提供改变状态的方法,它允许骑车者改变档位、刹车以及改变脚踏板的节奏等。

将具有相同属性和操作,并遵守相同约束规则的对象聚合成一组,这组对象集合就称为类(class),如自行车类,它是许多自行车的抽象;又如茶杯,有不同大小的茶杯,不同材料、不同形状、可以有完全相同的许多茶杯——茶杯类。

在图书管理系统中,“图书”是一个类,其属性具有书号、书名、作者、出版社等,

可以定义“修改”、“借出”、“还入”等操作。

一本具体的书如《解析Java程序设计》是一个对象,也是“图书”类的一个实例。

因此,通过分析和理解问题域,可以找出如表1-1所示的部分类。

表1-1图书管理系统中的部分类

类名

含义

类名

含义

Item

书目类

Reservation

预定类

BookItem

图书类

BorrowAndReturnInfo

借还信息类

MagaZine

杂志类

BookController

图书借还控制类

Borrower

借阅者类

类将对象的数据和操作都封装在类中,并实现了类的外部特性与类实现的隔离。

也就实现了使用者与开发者区分开,从而有良好的模块化特性,进而为复杂大系统的分析、设计、实现提供了先进的方法。

使用类的目的主要是为了提高编程效率。

因为程序中类是可重用代码。

3.类与对象的区别和联系

类包含了对象的所有属性和方法,它是对象的“模具”。

对象是类的“实例”,可以由一个类制造出多个实例。

当你创建了自行车类以后,你可以从这个类创建任意多个自行车对象。

当你创建了一个类的实例后,系统将为这个对象的实例变量分配内存。

注意:

类本身并不完成任何操作,它只是定义对象的属性及方法,而实际的操作则是由它所实例化的对象来完成的。

1.3.2事件和消息

消息(message)是对象间交互的手段,是要求某个对象执行某个操作的规格说明,是对象之间相互请求或相互协作的途径。

通常,一个对象向另一个对象发出消息请求某项服务,接收消息的对象响应该消息,

激发所要求的服务操作,并将操作结果返回给请求服务的对象。

在图书管理系统中,各对象之间发送消息、响应消息示意图如图1-4所示。

例如,使用电视机时,用户通过按钮或遥控器发出转换频道的消息,电视机变换对电视台的接收信号频率,并将结果显示给用户。

在这里,用户发出的信息包括:

接受者——电视机;要求的服务——转换频道;输入信息——转换后的频道序号;应答信息——转换后频道的节目。

当对象A想要对象B执行一个B中的方法,对象A就会发送消息给对象B,如图1-7所示。

有时候,接收的对象需要更多的信息才能使它可以正确知道该如何做。

比如,当你想改变自行车的齿轮,你就必须指出哪个齿轮,这个信息将作为参数来传递,如图1-8所示。

通常,一个信息由三个组件组成:

响应消息的对象YourBicycle、要执行方法的名字changeGears以及这个方法需要的所有参数lowerGear。

图1-7对象A发送消息给对象B图1-8信息作为参数来传递

事件(event)是系统产生的动作或是运行应用程序产生的动作,事件的概念和Windows中的相似,在Windows中,对于任何一个程序中的命令请求,例如鼠标的单击、移动、键盘按下等,都可以成为一个事件。

事件通过消息描述。

使用消息和事件机制的好处之一就是,调用者(发送方)不必知道被调用者(接收方)的全部信息,这可以减少调用者对被调用者的依赖。

例如,在Win32编程时,可以向系统中的任何一个窗口发送一个消息,但不必关心该窗口是否会处理这个消息,以及它会如何处理。

1.4面向对象技术的基本特征

面向对象技术强调在软件开发过程中面向客观世界或问题域中的事物,采用人类在认识客观世界的过程中普遍运用的思维方法,直观、自然地描述客观世界中的有关事物。

面向对象技术的基本特征主要有抽象性、封装性、继承性和多态性。

1.4.1抽象性

抽象(abstract)是人类解决复杂问题的一种基本方法。

把众多的事物进行归纳、分类是人们在认识客观世界时经常采用的思维方法,“物以类聚,人以群分”就是分类的意思,分类所依据的原则是抽象。

抽象就是忽略事物中与当前目标无关的非本质特征,更充分地注意与当前目标有关的本质特征,从而找出事物的共性,并把具有共性的事物划为一类,得到一个抽象的概念。

例如,在设计图书管理系统的过程中,考察某本图书时,只关心图书的书号、书名、作者、出版社等,而忽略图书的颜色、页码等信息。

因此,抽象性是对事物的抽象概括描述,实现了客观世界向计算机世界的转化。

将客观事物抽象成对象及类是比较难的过程,也是面向对象方法的第一步。

例如,将图书抽象成对象及类的过程如图1-9所示。

在开发一个系统时,只是在一定的范围(也称问题域)内考虑和认识与系统目标有关的事物,并用系统中的对象来抽象地表示它们,通过对象的属性来区分各对象,同类对象再抽象为类来描述,以实现代码重用。

在这里,对象只描述客观事物本质的、与系统目标有关的特征,而不考虑那些非本质的、与系统目标无关的特征。

图1-9抽象过程示意图

1.4.2封装性

封装(encapsulation)就是把对象的属性和行为结合成一个独立的单位,并尽可能隐蔽对象的内部细节。

例如图1-6中的自行车类即反映了封装性。

封装有两个含义:

一是把对象的全部属性和行为结合在一起,形成一个不可分割的独立单位。

对象的属性值(除了公有的属性值)只能由这个对象的行为来读取和修改;二是尽可能隐蔽对象的内部细节,对外形成一道屏障,与外部的联系只能通过外部接口实现。

封装的信息隐藏作用反映了事物的相对独立性,可以只关心它对外所提供的接口,即能做什么,而不注意其内部细节,即怎么提供这些服务。

例如,用陶瓷封装起来的一块集成电路芯片,其内部电路是不可见的,而且使用者也不关心它的内部结构,只关心芯片引脚的个数、引脚的电气参数及引脚提供的功能,利用这些引脚,使用者将各种不同的芯片连接起来,就能组装成具有一定功能的模块。

例如,电视机包括外形尺寸、分辨率等属性,具有打开、关闭、转换频道等服务,如

图1-10所示。

封装意味着将这些属性和服务结合成一个不可分的整体,用户通过按钮等接

口使用电视机,而不关心其内部的实现细节。

图1-10电视机类

封装的结果使对象以外的部分不能随意存取对象的内部属性,从而有效地避免了外部错误对它的影响,大大减小了查错和排错的难度。

另一方面,当对对象内部进行修改时,由于它只通过少量的外部接口对外提供服务,因此同样减小了内部的修改对外部的影响。

同时,如果一味地强调封装,则对象的任何属性都不允许外部直接存取,要增加许多没有其他意义,只负责读或写的行为。

这为编程工作增加了负担,增加了运行开销,并且使得程序显得臃肿。

为了避免这一点,在语言的具体实现过程中应使对象有不同程度的可见性,进而与客观世界的具体情况相符合。

封装机制将对象的使用者与设计者分开,使用者不必知道对象行为实现的细节,只需用设计者提供的外部接口让对象去做。

封装的结果实际上隐蔽了复杂性,并提供了代码重用性,从而降低了软件开发的难度。

每个对象至少具有一个接口,这个接口描述了对象对外界的消息、方法和响应。

对象受封装保护,外界不能直接修改、使用本对象所拥有的数据和代码。

封装使得对象的结构严谨、安全性高、有利于需求的不断变化。

把对象的属性和行为封装在一起能够保证数据类型的完整性和对象实现细节对外的屏蔽性,这样做有以下两个优点。

(1)模块性。

对象的源代码可以独立于其他的对象源代码来进行编写和维护。

同样,对象可以很容易地在系统中传递。

你可以将你的自行车对象给其他的对象,它仍然可以正常工作。

(2)信息隐藏。

一个对象如果有一个公共的界面,那么其他的对象就可以与之进行通信。

这个对象可以维护私人的信息和方法,它可以在任何时候被改变而不影响依赖于它的其他对象。

1.4.3继承性

客观事物既有共性,也有特性。

如果只考虑事物的共性,而不考虑事物的特性,就不能反映出客观世界中事物之间的层次关系,不能完整地、正确地对客观世界进行抽象描述。

运用抽象的原则就是舍弃对象的特性,提取其共性,从而得到适合一个对象集的类。

如果在这个类的基础上,再考虑抽象过程中被舍弃的一部分对象的特性,则可形成一个新的类,

这个类具有前一个类的全部特征,是前一个类的子集,形成一种层次结构,即继承结构,

如图1-11所示。

图1-11类的继承结构

例如,考虑轮船和客轮两个类,轮船具有吨位、时速、吃水线等属性和行驶、停泊等服务,客轮具有轮船的全部属性和服务,又有自己的特殊属性(如载客量)和服务(如供餐),因此客轮是轮船的子类,轮船是客轮的父类。

继承(inheritance)是一种联结类与类的层次模型。

继承性是指子类的对象拥有其父类的属性和行为。

继承简化了人们对现实世界的认识和描述,在定义子类时不必重复定义那些已在父类中定义过的属性和服务,只要说明它是某个父类的子类,并定义自己特有的属

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 小升初

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1