资源预览内容
第1页 / 共189页
第2页 / 共189页
第3页 / 共189页
第4页 / 共189页
第5页 / 共189页
第6页 / 共189页
第7页 / 共189页
第8页 / 共189页
第9页 / 共189页
第10页 / 共189页
亲,该文档总共189页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
,第3章 Java面向对象程序设计,3.1 面向对象程序设计基础 3.2 类和对象 3.3 类的封装性 3.4 类的继承性 3.5 类的多态性 3.6 静态修饰符、静态数据成员和静态成员方法 3.7 抽象类和最终类 本章小结 习题,3.1 面向对象程序设计基础 3.1.1 结构化程序设计 20世纪60年代提出了结构化程序设计(SP,Structed Programming)方法。所谓结构化程序设计,是一种自上而下、逐步细化的模块化程序设计方法。当解决一个复杂问题时,首先将总的求解任务划分为若干子任务,然后可以为每个子任务设计一个子程序。若子任务仍较复杂,可以将子任务继续分解。完成不同任务的程序在程序代码编制上相互独立,而在数据的处理上又相互联系。,对于解决一个简单问题的程序,Wirth N提出一个公式:算法 + 数据结构 = 程序,即编制程序就是定义数据和设计算法。定义数据就是选择合适的数据结构,设计算法就是根据所选择的数据结构编写解决问题的过程。结构化程序设计中,数据和过程是分离的,过程是对数据的操作。 结构化程序设计是一种面向过程的程序设计(POP,Procedure Oriented Programming)方法,即一个程序是由多个可独立编程的过程(在Java中为方法)模块组成的,过程之间通过函数参数和全局变量进行相互联系。,结构化程序设计按照工程的标准和严格的规范将系统分解为若干功能模块,系统是实现模块功能的函数或过程的集合。从历史上看,与以前的非结构化程序相比,结构化程序在调试、可读性和可维护性等方面都有很大的改进,当时确实很大地促进了软件的发展。但是,以过程为中心构造系统并编写程序,每一次设计新的系统,除了一些接口简单的标准函数,大部分代码都必须重新编写,不能实现代码的直接重用。,结构化程序设计将系统分解为若干功能模块,由于软、硬件技术的不断发展和用户需求的变化,按照功能划分设计的系统模块的功能要求容易发生变化,使得开发出来的模块的可维护性欠佳。并且,面向过程模式将数据与过程分离,若对某一数据结构作了修改,为了保证与数据的一致性,所有处理数据的过程都必须重新修订,这样就增加了编程的工作量,同时也加大了出错的概率。特别是随着问题规模的变大,编写的程序代码长度急剧增大,大大降低了程序的可维护性。,3.1.2 面向对象程序设计方法及特征 结构化程序设计从本质上说是面向“过程”或“操作”的,而“过程”和“操作”又是不稳定和变化的,不能直接反映求解问题的思路,很可能产生问题空间与方法空间在结构上的不一致。这种模式存在固有缺陷,不可能从根本上解决软件危机。,为了克服面向过程模式在设计系统软件和大型应用软件时所存在的缺陷,面向对象模式应运而生。面向对象程序设计是软件工程理论中结构化程序设计、数据抽象、信息隐藏、知识表示及并行处理等各种理论的积累与发展。在20世纪80年代,面向对象程序设计就已有了雏形。至20世纪末,由于Windows系统的广泛使用,软件开发工具也都支持面向对象程序设计,使面向对象程序设计技术进入了黄金时代。,现实世界是由各种各样的事物组成的,包括真实的事物和抽象的事物。例如,人、动物、植物、工厂、汽车和计算机等都是真实的事物,而思想、控制系统、程序、直线、文档和数据库等都是抽象的事物。每一类事物都有自己特定的属性(如大小、形状、重量等)和行为(如生长、行走、转弯、运算等),人们通过研究事物的属性和行为来认识事物。在计算机科学研究中,将这些现实世界中的事物称为对象(Object)。对象是包含现实世界中事物特征的抽象实体,它反映了系统为之保存信息和与之交互的方法。在程序设计领域,可以用如下公式表示对象:对象 = 数据 + 作用于这些数据上的操作。,为了描述属性和行为相同的一类对象,引入了类(class)的概念。类是具有相同数据结构(属性)和相同操作功能(行为)的对象的集合,并规定了这些对象的公共属性和行为方法。对象是类的一个实例,例如,汽车是一个类,而行驶在公路上的一辆汽车则是一个对象。对象和类的关系相当于程序设计语言中变量和变量类型的关系。 面向对象程序设计围绕现实世界的概念来组织模块,采用对象来描述问题空间的实体,用程序代码模拟现实世界中真实或抽象的对象,使程序设计过程更自然、更直观。结构化程序设计是以功能为中心来描述系统的,而面向对象程序设计是以数据为中心而不是以功能为中心来描述系统的,相对于功能而言,数据具有更强的稳定性。,面向对象程序设计还模拟了对象之间的通信。就像人们之间互通信息一样,对象之间也可以通过消息进行通信。这样,人们不必知道一个对象是怎样实现其行为的,只需通过对象提供的接口进行通信并使用对象所具有的行为功能,就像人们可在不知道汽车发动机如何工作的情况下,仍然可以很好地驾驶汽车。,面向对象程序设计把一个复杂的问题分解成多个能够完成独立功能的对象(类),然后把这些对象组合起来去完成这个复杂的问题。一个对象可由多个更小的对象组成,如汽车由发动机、传送系统和排气系统等组成。这些对象(类)可由不同的程序员来设计,并且设计好的对象可在不同程序中使用,这就像一个汽车制造商使用许多零部件去组装一辆汽车,而这些零部件可能不是自己生产的。采用面向对象模式就像在流水线上工作,最终只需将多个零部件(已设计好的对象)按照一定关系组合成一个完整的系统。,1. 对象 从一般意义上讲,对象是现实世界中一个实际存在的事物,它可以是有形的(比如一辆汽车),也可以是无形的(比如一项计划)。对象是构成世界的一个独立单位,具有自己的静态特征和动态特征。静态特征即可以用某种数据来描述的特征,动态特征即对象所表现的行为或对象所具有的功能。,现实世界中的任何事物都可以称为对象。人们在开发一个系统时,通常只是在一定的范围(问题域)内考虑和认识与系统目标有关的事物,并用系统中的对象来抽象表示它们。所以面向对象方法在提到“对象”这个术语时,既可能泛指现实世界中的某些事物,也可能专指它们在系统中的抽象表示,即系统中的对象。在这里主要针对后一种情况讨论对象的概念,其定义是:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务构成。,属性和服务,是构成对象的两个主要因素,其定义分别是:属性是用来描述对象静态特征的一个数据项;服务是用来描述对象动态特征(行为)的一个操作序列。 一个对象可以有多项属性和多项服务。一个对象的属性和服务被结合成一个整体,对象的属性值只能由这个对象的服务存取。,另外需要说明以下两点:第一点,对象只描述客观事物本质的、与系统目标有关的特征,而不考虑那些非本质的、与系统目标无关的特征。这就是说,对象是对事物的抽象描述。第二点,对象是属性和服务的结合体,二者是不可分的,而且对象的属性值只能由这个对象的服务来读取和修改,这就是后面要讲述的封装的概念。 根据以上两点,也可以给出如下对象的定义:对象是问题域或实体域中某些事物的一个抽象,它反映该事物在系统中需要保持的信息和发挥的作用;它是一组属性和有权对这些属性进行操作的一组服务的封装体。,2. 类 把众多的事物归纳、划分成一些类是人类在认识客观世界时经常采用的思维方式。分类所依据的原则是抽象,即忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。例如:马、树木、石头等等都是一些抽象概念,它们是一些具有共同特征的事物的集合,被称做类。类的概念使我们能对属于该类的全部个体事物进行统一的描述。例如,“树具有树根、树干、树枝、树叶,能进行光合作用”,这个描述适合于所有的树,从而不必对每棵具体的树都进行一次这样的描述。,在面向对象方法中类的定义是:类是具有相同属性和服务的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。 在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名,并包括属性说明和服务说明两个主要部分。类的作用是定义对象。例如,程序中给出了一个类的说明,然后以静态声明或动态创建等方式定义它的对象实例。,类与对象的关系如同一个模具与用这个模具铸造出来的铸件之间的关系。类给出了属于该类的全部对象的抽象定义,而对象则是符合这种定义的一个实体。所以,一个对象又称做类的一个实例(instance),而有的文献又把类称做对象的模板(template)。,3. 封装 封装是面向对象程序设计的一个重要原则。它有两方面涵义:第一个涵义是,把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。第二个涵义也称做“信息隐蔽”,即尽可能隐蔽对象的内部细节,对外形成一个边界(或者说形成一道屏障),保留有限的对外接口使之与外界发生联系。这主要是指对象的外部不能直接存取对象的属性,只能通过几个运行外部使用的服务与对象发生联系。用比较简练的语言给出封装的定义:封装就是把对象的属性和服务结合成一个独立系统单位,并尽可能隐蔽对象的内部细节。,封装的原则具有很重要的意义。对象的属性和服务紧密结合反映了这样的一个基本事实:事物的静态特征和动态特征是事物不可分割的两个侧面。系统把对象看成属性和服务的结合体,使对象能够集中而完整地描述并对应一个具体事物。封装的信息隐蔽作用反映了事物的相对独立性。当我们站在对象以外的角度观察一个对象时,只需要注意它对外呈现什么行为(做什么),而不必关心它的内部细节(怎么做)。规定了其职责之后,就不应该随意从外部去改动它的内部信息或干预它的工作。封装的原则在软件上的反映是:要求使对象以外的部分不能随意存取对象的内部数据(属性),从而有效地避免了外部错误对它的“交叉感染”,使软件错误能够局部化,大大减少了查错和排错的难度。,另外,当对象的内部需要修改时,由于它只通过少量的服务接口对外提供服务,因此大大减少了内部的修改对外部的影响,即减少了修改引起的“波动效应”。 封装是面向对象程序设计的一个原则,也是面向对象技术必须提供的一种机制。例如在面向对象的语言中,要求把属性和服务结合起来定义成一个程序单位,并通过编译系统保证对象的外部不能直接存取对象的属性或调用它的内部服务。这种机制就叫做封装机制。 与封装密切相关的一个术语是可见性,指对象的属性和服务允许对象外部存取和引用的程度。,封装也具有一定的副作用。如果强调严格的封装,则对象的任何属性都不允许外部直接存取,因此就要增加许多没有其他意义只负责读或写的服务。这为编程工作增加了负担,也增加了运行开销,而且使程序显得臃肿。为了避免这一点,程序设计语言往往采用一种比较现实的灵活态度运行对象有不同程度的可见性。在Java中,通过权限修饰符来设定对象的可见性。,4. 继承 继承是面向对象设计方法中一个十分重要的概念,并且是面向对象程序设计技术可提高软件开发效率的重要原因之一,其定义是:特殊类的对象拥有其一般类的全部属性与服务,称做特殊类对一般类的继承。 例如,轮船类和客轮类。客轮是轮船和客运工具的特殊类,轮船是客轮的抽象表现形式。在Java语言中,我们通常称一般类为父类(superclass,超类),特殊类为子类(subclass)。 其关系图如图3-1所示。,图3-1 父类与子类关系图,继承意味着“自动地拥有”,或“隐含的复制”,就是说特殊类中不必重新定义已在它的一般类中定义过的属性和服务,而它却自动地、隐含地拥有其一般类的所有属性与服务。面向对象方法的这种特性称做对象的继承性。从一般类和特殊类的定义可以看到,后者对前者的继承在逻辑上是必然的。继承的实现则是通过面向对象程序设计语言的继承机制来实现的。,一个特殊类既有自己新定义的属性和服务,又有从它的一般类中继承下来的属性和服务。继承来的属性和服务尽管是隐式的,但是无论在概念上还是在实际效果上都确确实实地是这个类的属性和服务。当这个特殊类又被它的更下层特殊类继承时,它继承来的和自己定义的属性和服务又都一起被更
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号