




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章 面向对象技术导论 面向对象(Object-Oriented)技术体现了计算机程序设计的 一种思想,这种技术体现在具体的开发语言中,如Java语 言。一种语言完全或部分的以面向对象的思想设计和实现 就称该语言为面向对象的计算机程序开发语言。 本节既然是导论,目的是希望读者对面向对象编程具有初 步认识,当然这需要具体内容来介绍。面向对象技术主要 体现在面向对象的思想,进而讨论类和对象(类的实体) ,而继承、多态、封装又是面向对象思想不可替代的优势 体现,所以本章将对面向对象的主要内容做细致的讲解, 该章是面向对象程序设计的基础,具有抽象性的特点,但 是只有确实理解和把握了这些思想才能更好的利用Java语 言进行程序设计和代码的编写。 7.1 万事万物皆对象 在以往的程序开发语言如C语言中,整个程序是过 程式的。面向对象的思想出现的比较早。在80年 代软件开发方面面向对象技术再次成为研究的热 点,其中,Booch、Coad/Yourdon、Jacobson在面 向对象的研究中获得了业界的广泛认可。尤其是 统一建模语言综合了Booch、Coad/Yourdon、 Jacobson的各自优点,并且吸收了许多工程实践 经验的理念和技术,成为OMG面向对象方法的标准 。应用到计算机编程领域后,它的突出优势体现 在对象概念上。这种把万物抽象化为对象的思想 ,符合人类对事物理解的思维方式,把这种思维 方式应用到计算机程序设计上可以流畅的表达程 序员的思想,简化系统的分析和设计。 7.1.1 程序设计中的抽象化认识 我们日常生活中的对象(Object)可以是具体的实物,如 桌子、灯泡、电视等。也可以是抽象的事物,如一个想法 。抽象的事物摸不着、看不到,但是人类的思想可以感受 到,最终它可以通过某种方式体现出来,所以抽象和具体 是事物的两端,是人类智慧的体现。 计算机程序设计在程序员角度讲就是对待解决问题的建模 ,这种建模的过程就是对问题域进行抽象化认识的过程。 将问题空间中诸元素表示成对象。将对象的行为描述为具 体的实现方法,把对象的静态特性描述为具体的静态属性 。程序可以根据特定的问题领域而灵活的添加新类型的对 象。因此在理解分析待求解的问题时也就完成了对问题的 抽象化认识,把抽象化的结果用面向对象的程序设计语言 实现。 在面向对象的程序设计中,对象无处不在。整个程序是由 功能各异的对象组成的。对象间通过消息通信,协调完成 一系列任务。 7.1.2 如何获得和操控对象 Java语言本身是一种面向对象的程序设计语言。 所以采用该语言进行程序设计之前必须接纳并理 解面向对象的思想。而一旦转换到OO的编程语言 中,将极大地提高编程能力和编程效率。7.1.1节 讲过,面向对象的程序全部由对象组成,对象无 处不在,对象之间相互通信,互相协调完成软件 的功能要求。 那么在Java中如何操纵对象呢?Java给出了统一 的对象操控方式即采用对象的“引用”,通过引 用来操控对象,如修改其属性、向对象发消息、 调用对象的行为等。我们以一个具体的Employee( 雇员类)类说明如何获得和操控对象。 7.1.3 对象的存储空间 理解了程序设计中的抽象概念,把握了如何获得和操控对象后,有必要知 道程序运行时,对象在内存中是如何存储的。 首先分析一下对象相关的哪些内容需要存放,这里介绍的流对象和持久化 对象在以后的章节还会讲解,这里读者知道存在这样的东西,关键是知道 它们对应的存储空间。 引用:在7.1.2节介绍了引用,引用是操控对象的一个句柄,就如用遥控 器操纵电视一样,此时遥控器是引用,电视是电视类的一个具体实体。这 样引用就可操控对象的属性和行为了。 Java对象:Java对象是通过new关键字创建的一个类实体,这个对象不是 像类定义那样是个概念性的东西,而是具体的可以操控的实体了。 静态数据:静态数据是指由static关键字修饰的数据,如static float rate = 0.523;这类数据存储在内存中的固定位置。当然static关键字即 可以修饰类,也可以修饰方法,但这些static类和方法存放的地点与静态 数据不同。 常量数据:常量数据是在整个程序中永远不会改变的数据。 流对象和持久化对象:Java程序中的对象一般实在程序运行时存在的,可 以随时供系统调用,这些对象存活于程序之中。但Java存在一种存活于程 序之外的对象或数据,可以不受运行时刻程序控制,而独立存在。典型的 是“流对象 ”和“持久化对象 ”。二者都把对象存储在磁盘上,并保存 了当时对象的状态。在需要该对象时,可以通过某种方式生成常规的对象 。 7.1.4 对象的生存空间 人类的生命是有限的。一个人类对象也就是一个 具体的人在生命周期内可以完成很多事情。而在 生命周期外则无能为力了。每个具体生命不会无 休止的生活在这个世界上,不然地球的各种资源 也无法承受。每个生命个体在离开这个世界时得 到适当的清理。对于程序中的对象也有类似的问 题。 Java对象具有生命周期,在生命周期内系统可以 随时调用。但这样的对象不可能全部存活于内存 中,不然很快就会耗尽内存资源。所以,系统会 适当销毁一些暂时不用的对象,以释放空间给新 的对象使用。 7.2 一种新的数据类型:类(Class) 类是面向对象思想的重要概念。其实,面向对象 程序设计的本质就是类的设计,在分析问题域后 ,抽象出适当的类,完成类的属性、行为和类间 的通信接口设计,从而完成一个软件系统。类也 是Java中的一种数据类型。 本节重点讲解类的 组成成份,辅助介绍其他相应的构件。 7.2.1 类(class)概述 在Java中万物皆对象。一个对象必定区别于另一个对象而成为 自己。对象具有静态属性和动态行为。其实,正是这些静态属 性和行为是一个对象区别于另一个对象的本质。但对象具有一 定的外观,正如人的名字一样。所以从外在看,一个对象可从 命名的角度区别于另一个对象,而内在是对象的属性和行为上 有区别。 Java使用class关键字命名类,在关键字class后书写类名。如 : class ClassName 这样就定义了一个类类型,此时类主体 内什么也没有。所 以,该类不能完成任何任务。但它已经是符合Java规范定义的 类了。可以生成该类的对象,并且不受对象数目的限制。 ClassName newClass = new ClassName(); 显然这个对象是不能做任何事情的,因为类主体内什么也没定 义,没有静态的属性,也没定义合适的方法。下节将介绍类的 属性和方法。 7.2.2 类的属性详解 在Java程序设计中所有的工作就是定义类。定义一个类就需要 向类的主体内增加两种元素,一是属性、一是方法。本节重点 讲述类的属性。 属性是说明对象的静态属性的。如汽车类,该类的对象具有某 些共有的属性,如车的颜色、品牌、加速度、外观款式等。这 些可以从静态的角度描述这类事物。类的属性可以是内置数据 类型,如int型、byte型、boolean型、char型等。也可以是 类类型。假设已经定义了类Worker类,下面定义一个Car类。 在Car类中把Worker类对象引用作为其一个属性。 class Car String color; float velocity; char style; Worker worker; 7.2.3 类的方法详解 这里从两个方面详细地介绍方法,一个是方法概述、一个 是参数和返回值。 (1)方法概述:若想让对象可以做些事情,就必须定义对 象的方法(method)。在过程式语言中用函数来表述一个 子程序,这里的函数功能和Java中对象的方法是异名同工。 不过既然Java规范中定了对象的行为是方法,本书就沿用规 范的概念。 (2)参数和返回值:方法的参数是在对象调用此方法或向 对象发送消息时,需要向方法提供的信息,方法可以把提 供的信息经过方法主体的处理从而完成方法的功能。参数 要求有参数类型和参数引用,其实说到引用读者或许有疑 问,引用是相对于类对象而言的 ,引用是操控对象的句柄 。其实,Java中类方法中的参数就是对象形式的。传入参数 的对象类型必须和参数要求的对象类型相同。 7.2.3 一种特殊的方法-类的构造函数 构造函数是类的一种特殊方法。该方法的作用是在类的实例化过程中初始化一 些参数,如在界面编程中,会在类的构造函数中初始化用户界面控件,完成界 面元素的布局等。有的类具有多个构造函数,多个构造函数之间参数不同,可 以完成不同参数条件下的对象实例化操作。 Java提供默认的构造函数,如果没有为类设计自己的构造函数,编译器会自动 为该类添加一个构造函数。这也是该构造函数与普通方法的区别。代码缺省构 造函数示例。 代码 缺省构造函数示例 1 /定义一个类 Tree 2class Tree 3int height ; /声明树的高度变量。 4 5/定义一个类DefaultConstructor 该类生成一个Tree类的对象 6Public class DefaultConstructor 7Public static void main(String args) 8/创建类Tree的对象,调用了默认构造函数Tree(); 9Tree tree = new Tree(); 10 11 7.2.4 关键字static 在Java中经常会看到static关键字修饰的数据或方法,static 是静态的意思,表示该数据或对象在内存中只有一份。Static 关键字可以修饰数据、方法和类。其实Static可以修饰任何类 型的数据,这里进行分类使读者可以更清晰地理解其用法。 1static关键字修饰内置数据:Static关键字修饰内置数据的 格式是在数据声明前放置关键字static,修饰一个浮点型数据 。 Class StaticFloatTest static float rate = 1.12f; 2static关键字修饰方法:方法是类的组成成分,也就是说类 把方法包裹起来,一般在调用对象的方法时首先需要new一个 对象,产生该对象的实例,再通过对象引用来调用属性数据或 调用方法(也称为向对象发消息)。然而使用static修饰的方 法可以直接用该类调用。访问格式是: className.staticMethod(); 7.2.5 关键字this this是Java的一个关键字。一旦创建一个对象实例,虚拟机就为该对象创建一 个默认的指向自己的指针。this只能用在方法中,就是指当前对象。为了说明 this指针就是指向“这个对象”,给出一个示例,该示例中定义一个方法在该 方法中使用this调用对象的属性信息和方法成员。代码this指针的使用。 代码 使用this关键字示例1 1class ThisTest1 2private String name ; 3private void thisRoo()/*方法主体*/ 4private void thisFoo(String name) 5 = name;/为 类属性name赋值,参数名也为name 6 7private void thicCoo() 8this.thisRoo() ; /在方法thisCoo()中调用该类的方法thisRoo() 9 10 7.3 访问权限 面向对象技术的一个特点就是封装,把数据和方法放在一 个类的内部,而对使用该类的用户只开放必要的接口,对 敏感数据或不需要用户知道的数据和方法则隐藏在类的内 部,外部用户不可见。这样就把类的创建者和类的使用者 之间隔离开,类的创建者隐藏了部分细节而只公开用户需 要的部分,这样只要类对外(这里的对外是指使用类的用 户可见的部分)公开的接口不变,无论类的创建者如何改 变类内隐藏的方法或数据结构,都不会影响用户的使用。 因此设置访问权限的一个原因就是让使用类的用户只能操 控类的设计者允许的内容,而不能触及对使用者没用的部 分。这部分数据属于类的内部操作,对用户来讲这些操作 不能提供直接的服务,不是解决特定问题所需的接口。 7.3.1 包(package) 包是一种类的集合,为程序的开发提供了良好的接口或现 成的工具类,本节介绍有关包的基本概念和如何自定义包 ,实现程序员自己定义的工具类集合。 1包概述:包(package)是类的集合,程序员既可以自己 编写工具制作成包来使用,也可以使用系统提供的类库, 这些类库也是以包的形式出现。只要用户在程序的开始处 标记,导出相应的工具包。用户就可以方便的调用包中的 工具类。 2包名的约束:可以想象如果在两个包具有相同的名称, 编译器根本无法辨别到底使用哪一个,此时编译器就会提 示错误。所以如何避免包名称的重复是必须认真对待的问 题。设置包名字的宗旨就是保证包名的独一无二。 7.3.2 设置Java访问权限 Public、protected和private是java设置访问权限的修饰 词。使用方式都是把该关键字放在需要修饰的成分前,不 论该成分是属性还是方法。如: 1public Sting username; 2private static int RATE = 0.77; 3protected void setUserName(String username) 4this.username = username; 5 显然,无论是在属性或方法前,关键字仅仅修饰其后定义 的成分。当然用户也可以不写访问权限的修饰词,此时是 默认的包访问权限。下面一次介绍Java的访问权限关键字 。 7.4 继承 继承是面向对象编程的重要组成部分,也是Java 语言的重要成分。继承是很好理解的一个概念。 在现实生活中如儿子继承父亲的家业,从而利用 父亲的资源发展自己的事业,实现了资源利用, 避免了自己去打拼,这便是现实生活中的继承概 念。生活中的继承概念可以与Java程序设计中的 继承概念相类比,这样有助于理解继承概念。通 过继承最大的好处就是“代码重用”(继承资源 ),提高代码编写效率。Java的继承与C+不同, Java不支持多继承只支持单继承。下面就如何引 入继承、如何实现继承等问题继续介绍Java的继 承。 7.4.1 什么是继承 继承是面向对象程序设计的基本特点之一,通过 继承使得代码重用得以实现,程序员自己编写的 设计良好的类,可以制作成类库即Jar文件,这样 这些类不但可以供自己使用也可以通过释放接口 给其他程序员使用,如Java就设计了功能强大的 类库,通过继承方式使用户可以很好地实现所需 功能,极大的提高了编程效率。如果用户需要实 现多线程程序,在Java中只需要继承Thread类就 可以了,其他与操作系统相关的操作都交给父类 去实现,子类只需要实现父类的run()方法,把需 要多线程实现的操作放在该方法中。 其实,当用户创建一个类时,总是在使用继承, 因为Java默认所有用户创建的类继承自Object。 7.4.2 如何实现继承 Java提供了extends关键字实现继承的语法。在继承过程中,需要 首先声明一个类继承另一个类,即继承自父类。在子类名称的右 边紧跟extends关键字,随后是父类的名称。一旦完成上述操作, 子类会自动获得父类的所有属性和方法。为了说明继承的使用方 式,和一些实现细节,设计了一个父类,如代码所示: 7.4.3 super关键字 在继承中,如果子类需要覆盖父类的某个方法,同时还需要调用 父类中同名的方法,此时如果直接调用该方法,显然会出现循环 。所以,Java给出super关键字来解决该问题。示例程序如代码所 示。 7.5 多态 多态是面向对象程序设计的组成部分,多态和面 向对象的其他技术结合在一起,它不单独存在, 而是同数据抽象和继承技术结合使用。能多态的 概念简单的说就是一个事物可以完成多项功能。 在C+中,多态就是使用基类的指针指向派生类的 对象,看起来同样的指针来调用同样的函数却产 生了不同的行为能力,即实现了多态。 7.5.1 什么是多态 首先通过一个例子获得对多态的直观认识。该程序首先设计一个 基类,三个派生类(或叫做子类),基类和派生类中都设计了方 法draw(),但是不同的子类该方法的具体实现是不同的,都具有 自己的特征行为。我们在实现类中通过实现类对象调用了该类中 的方法foo(),虽然设计该方法时,其参数为基类Shape对象,但 是,我们传入的是子类的对象,该函数照样正常运行,并得到我 们预期的结果,分别调用了子类自己的draw()方法,这就是多态 的具体体现。示例程序如代码多态示例所示。 7.5.2 方法的重载 方法重载的作用是在子类中对于在父类中出现的 方法赋予新的行为能力。从重载的作用可以看到 ,方法的重载发生在子类中,并且是对父类中出 现的方法赋予新的生命。这里暂不讨论重载的缺 陷,通过一个例子的分析重载的注意事项。该示 例有一个父类三个子类,父类拥有两个方法,即 setColor()和draw(),其中前者具有private访问 权限,后者具有public访问权限,我们的目的是 在子类中通过重载来实现子类和父类同名的且具 有不同行为的方法,从而实现多态,但是这里会 出现问题,在阅读了代码后,我们通过编译该程 序看代码的执行结果。 7.5.3 抽象类和抽象函数 Java提供了一种抽象类机制。我们先给出抽象类的实现和 相关语法,再给出Java设计该机制的初衷。 如果一个类包含抽象方法(abstract method),该类就是 抽象类,但抽象类不一定必须具有抽象方法。而抽象方法 是一个不完整的方法,它没有声明方法体,通过关键字 abstract声明抽象方法。如下所示是抽象方法的声明语法 : Abstract void methodname(); 具有抽象方法的类就是抽象类,这里说明只要有一个方法 是抽象方法该类就是抽象类。抽象类可以被子类继承,但 是子类必须实现抽象类的所有抽象方法,否则该子类也是 抽象类,并且编译器会要求使用abstract关键字修饰该子 类,抽象类也不能产生对象,即通过new关键子无法创建新 的抽象类对象。 7.6 接口 在上节学习了抽象类和抽象方法,在抽象类中允 许一部分方法有自己的定义或实现,而抽象方法 则没有提供具体的方法实现,需要其子类去实现 。相对于抽象类而言,接口是更纯粹的抽象类, 它的所有方法没有提供任何实现,只是给出方法 的声明,接口一旦被实现(implements)就象普 通类一样使用了,但是必须实现其声明的全部方 法,另外接口可以定义属性,也可以为属性赋予 初始值。Java使用关键字interface创建一个接口 。本节将介绍接口的定义、语法实现和相应的注 意事项。 7.6.1 接口定义 接口是Java定义的一个更加纯粹的抽象类,它声明的方法 只有返回类型,方法名和方法参数,但是没有函数体,这 些方法必须声明为public的,即使不声明为public的,接 口中方法的默认访问属性也是public的。代码定义了一个 接口。 代码接口定义程序示例 1/通过关键字interface声明接口 2interface Shape 3String shapetype = “hello”; 4Int number = 1000; 5public void draw(); 6public void setColor(); 7 7.6.2 接
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年教育机构人才流失原因分析及吸引机制创新报告
- 物业收费权转让合同范本
- 渔货代卖合同协议书模板
- 高校与美团配送合同范本
- 续签合同时让签竞业协议
- 鲜玉米采购标准合同范本
- 电力局承包劳务合同范本
- 香蕉收购协议书模板模板
- 海底捞如何解除合同协议
- 电梯安装加工合同协议书
- 2025年中国大唐集团有限公司应届毕业生招聘笔试历年参考题库附带答案详解
- 2025年安徽交控集团所属安徽交控建设工程集团第二批招聘10人笔试参考题库附带答案详解版
- 体育场馆运行管理办法
- 学前资助实施管理办法
- 2025安全生产月如何查找身边安全隐患宣讲课件
- 疳症中医护理常规
- 2025年6月14日江苏省纪委监委比选笔试真题及解析(巡视监督岗)
- 4输变电工程施工质量验收统一表式(电缆工程电气专业)-2024年版
- 2024年中国远洋海运集团专项招聘真题
- 海宁辅警笔试题目及答案
- JG/T 438-2014建筑用真空绝热板
评论
0/150
提交评论