




已阅读5页,还剩43页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章面向对象程序设计基本概念 面向对象的程序设计 OOP 已成为现代软件开发的必然选择 通过掌握面向对象的技术 能开发出复杂 高级的系统 这些系统是完整健全的 但又是可扩充的 OOP是建立在把对象作为基本实体看待的面向对象的模型上的 这种模型可以使对象之间能相互交互作用 面向对象程序设计在一个好的面向对象程序设计语言 OOPL 的支持下能得到最好的实现 Java就是一种优秀的OOPL 它提供了用来支持面向对象程序设计模型所需的一切条件 Java有自己完善的对象模型 并提供了一个庞大的Java类库 并有一套完整的面向对象解决方案和体系结构 本章介绍面向对象的概念和对象建模的方法 讲解Java对象模型中的核心部分 类及类的成员 使读者学会如何用创建和使用Java对象 2 3 1对象 定义 一个对象就是变量和相关方法的封装 其中变量表明对象的状态 方法表明对象的行为 软件对象既可以模拟现实世界的对象 也可以表示抽象的概念 对象示意图 3 3 1对象 封装 能把对别的对象来说并不重要的对象的实现细节隐蔽起来 在使用一个对象时 只需知道怎样引用它的方法而无须知道它的具体实现 封装的优点 模块化 一个对象的源代码的编写和维护独立于其它对象的源代码 而且 对象在系统中很容易使用 信息隐蔽 每个对象都有一个公共接口使得其它对象可以与其通讯 但对象能维护自己的私有信息和方法并能在任何时候改变它们而不会影响使用它的其它对象 3 1对象 SmallTalk的特征 1 所有东西都是对象 可将对象想象成一种新型变量 它保存着数据 但可要求它对自身进行操作 2 程序是一大堆对象的组合 通过消息传递 各对象知道自己该做些什么 3 每个对象都有自己的存储空间 可容纳其他对象 4 每个对象都有一种类型 根据语法 每个对象都是某个 类 的一个 实例 其中 类 Class 是 类型 Type 的同义词 一个类最重要的特征就是 能将什么消息发给它 5 同一类所有对象都能接收相同的消息 3 1对象 理解对象使用对象对象之间的关系 面向对象程序设计中的对象与客观世界中的对象并不是完全相同的概念 他们既有联系又有区别 所以深刻理解编程中的对象本质将有利于实践面向对象编程和开发 3 1 1理解对象 对象可以视为一组相关的操作代码和数据的组合对象是类的实例对象可以互相协作 共同完成任务通过继承 组合或封装等方式可以产成新的对象对象根据特定的意义和用途有不同的划分方法 3 1 2使用对象 设计果园系统 一个面向对象的果园系统假设我们要开发一个最简单的果园系统GardenSys 用面向对象的方法来分析 这个果园系统至少包括园丁和水果这两个对象 园丁的工作包括种植各种水果 水果的行为包括生长和收获 不同的水果还有不同的名称 园丁种植水果 园丁与水果存在关联关系 3 1 2使用对象 对象的创建和销毁 对象是通过类创建的 对象是类的动态实例 每个对象都有生命期 一个对象按其生命期来分析 一般有三个阶段 出生 活动 死亡 而我们在编程中要做的对应为 创建 初始化 运行 销毁 通常 当调用构造函数时 该函数返回一个新分配内存并初始化了的类的实例 Java构造函数是一种比较特殊的函数 它不能由用户来指定返回类型 只能返回所属类的类型 它也不能由用户来指定其它名称 只能使用与类名相同的名称 即便如此 我们仍然可以通过方法的重载 overload 来为一个类提供多个不同的构造函数 在Java中没有用于销毁和清理对象的析构函数 因为Java提供了垃圾回收 GarbageCollection 简称gc 机制负责释放对象所占用的内存空间及相关的其它资源 3 1 2使用对象 对象和对象变量 从语义上讲 对象是类的实例 类是创建对象的模板 从语言上讲 对象也是类这种数据类型的变量 对象在内存中占有空间 但是在具体使用中 对象与传统的变量 也就是Java中基本类型的变量有区别 对象是一种引用类型 对象由类创建 存储在堆中 而对象变量则是对象的引用 存储在栈中 在程序中我们通过对象变量 也就是对象的引用 来操纵对象 引用类型的演示 MyClassa b 声明MyClass类型的变量a和b MyClass是一个Java类a newMyClass 变量a引用了MyClass类创建的对象实例a myvar 24 给对象实例的字段myvar赋值b a 变量b得到的是变量a的一个引用的副本 结果使他们都引用了同一个对象实例 a myvar a myvar 1 改变对象字段的值System out println a myvar 此时显示a myvar值为25System out println b myvar 此时显示b myvar值也为25 3 1 3对象之间的关系 对象之间的关系有 合成关系 has a 继承关系 is a 依赖关系 use a 面向对象程序设计的高效关键在于它让每个对象负责执行一组相关的任务 如果对象依赖于其他对象负责处理的任务 那么它就去访问负责这个任务的对象 这时第一个对象就请求第二个对象执行任务 即这个对象依赖于另一个对象 另外 一个对象不能直接操作另一个对象内部的数据 它也不应让其他对象直接访问自己的数据 所有的通信都应该通过方法调用来完成 通过对对象数据的封装 就可以使可重用性最大化 减少数据依赖 并且使调试时间最小化 当然 就像面向过程语言中的模块一样 不应该让一个对象负责过多的事情 创建完成少量任务 规模较小的对象会使设计和调试过程都变得较为简单 相反 创建数据复杂 函数众多的对象 则会使开发过程变得极为复杂 因此理解对象之间的关系可以帮助我们设计出可重用 易维护的代码 降低耦合性 提高灵活性 11 3 2什么是消息 对象间相互作用和互相通讯是通过发送消息来实现的 当对象A让对象B执行它的某个方法时 对象A就要向对象B发送消息 12 3 2什么是消息 一个消息通常包括三部分 接受消息的对象接受消息的对象应执行的方法方法所需要的参数消息模式的优点 利用对象的方法来表示对象的行为 收发消息能支持对象间所有可能的交互作用 收发消息的对象无须在同一个进程里 甚至无须在同一个机器里 13 3 3什么是类 定义 类是一类对象的抽象或原形 它定义了该类对象的共同的状态和方法类和对象的区别 类 是一类对象的原形 是对该类对象的抽象 对象 是某个类的一个实例 是客观存在并能够使用的 类的优点 有效地支持了软件重用 程序员使用一个类可以反复创建多个对象 第三章面向对象程序设计的基本概念 3 3类 例如 对于园丁所种植的香蕉 橘子 葡萄等不同的水果对象 它们有共同的名称属性 以及种植和收获的操作 因此可将它们划归为果园系统中的水果类 3 3 1什么是Java类 当用户编写自己的Java程序时 主要工作就是编写类 当程序运行时 已声明的类用来创建新对象 由类创建对象的过程称为实例化 instantiation 每个对象都是类的一个新实例 instance 类是一种抽象数据类型 在Java中类也被当作一个数据类型来定义 类的语法结构包括关键字class 跟在后面的类名称 如果其继承自某个基类 还需要使用extends关键字加基类名称 类通常不需要从头生成 相反 他们可以从其他的类派生而来 继承祖先类的可用类成员 包括 字段 方法等 即使是从头创建的新类也必须是继承自Object类 只不过我们可以合法省略extendsObject而已 class类名extends基类 类的函数成员构造函数1 构造函数2 方法1 方法2 类的数据成员字段1 字段2 3 3 2类成员 类成员包括数据成员和函数成员 数据成员是面向对象的术语 用于表示类中的数据变量 即Java中的字段 field 函数成员也是面向对象的术语 用于表示类中的操作 Java的函数成员包括方法和构造函数 方法是一些封装在类中的过程和函数 用于执行类的操作 完成类的任务 构造函数是一种特殊的方法 用于对象的创建和初始化 3 3 3类成员的可访问性 类成员包括数据成员和函数成员 类的每个成员都有一个称为可访问性的属性 用来保护类成员 Java有四种类成员的保护方式 分别为缺省的 public 公有的 protected 保护的 private 私有的 为了使程序具有良好易读的风格 建议最好在撰写类代码时用不同的可访问性来组织类成员 并将public成员作为对外公布的接口放在最前面 以便引起关注 3 3 4方法 方法是在类中定义 用来实现对象操作的过程或者函数 方法是类的成员 并有自己的可访问性 Java程序中 方法的声明和方法的实现是分开的 方法与普通函数和过程不同 方法只应用于特定类及其祖先类的对象 另外 每一个方法都有一个隐含的参数 称为this 它引用作为方法调用主体的对象 调用一个方法的语法格式是 对象名 方法名 实际参数 实例字段和实例方法是属于某一具体实例对象的字段和方法 必须先创建这个实例对象 然后才能使用这些字段和方法 对于同一个类创建的不同的实例对象 其字段可以有不同的取值 以反映该对象的不同状态 除此之外 还有一种通过类就可以直接访问的静态字段和静态方法 这种静态的字段和方法用static关键字标识 不需要创建实例就可以通过类直接访问 19 3 4什么是继承 定义 利用现有的类 supperclass 定义新的类 subclass 子类可以继承父类的属性和方法并可以增加新的属性和方法或重载父类的方法 对象的继承是一种在保持对象差异性的同时共享对象相似性的复用 它是源自类的泛化机制 这种抽象机制允许类之间共享代码 大大减少了代码长度并且使软件易于维护 对象通过继承 保证了实现部分紧内聚和松耦合的良好特性 第三章面向对象程序设计的基本概念 3 4什么是继承 第三章面向对象程序设计的基本概念 继承的优点 子类提供了基于父类公共部分的更具体的行为 利用继承子类可以重用父类多次 可以定义一个称为抽象类的父类来定义一般行为 21 3 4什么是继承 交通工具 汽车 卡车 旅行车 小汽车 轿车 跑车 面包车 基类 祖先类 父类 子类 派生类 子类 派生类 第三章面向对象程序设计的基本概念 3 4 1使用继承 基类与派生类Java中派生类通过extends关键字继承基类 并通过super关键字访问基类的构造函数和方法 Java中所有的类都继承了Object类的toString方法 我们可以重写并覆盖toString方法 使之带有对象的具体信息 以便我们跟踪和调试对象 继承关系形成了树状的类层次结构 继承产生的派生类不能直接访问其基类的private成员 但所有其他基类成员通过继承成为派生类的成员后 保持它们原来的成员的可访问性 并可在派生类中使用 面积 length width 周长 2 length width Square需要重写并覆盖基类的calcPerimeter方法来计算周长 周长 4 length Square可以继承基类Rectangle的calcArea方法来计算面积 无须另写代码 图4 2在这个UML类图中 Square继承了Rectangle 是Rectangle类的扩展 示例程序4 1Retangle类 Retangle java publicclassRetangle publicRetangle doublel doublew length l width w publicdoublecalcPerimeter return2 length width publicdoublecalcArea returnlength width publicStringtoString return 长为 length 宽为 width 的长方形 protecteddoublelength privatedoublewidth 示例程序4 2Square类 Square java publicclassSquareextendsRetangle publicSquare doubleside super side side publicdoublecalcPerimeter returnlength 4 publicStringtoString return 边长为 length 的正方形 3 4 1使用继承 基类与派生类继承在果园系统中的使用 3 4 2继承与合成 面向对象程序设计中 通过合成或通过继承都可以在不同的环境中重用已有的设计和实现 但经验表明 除非所有继承的方法都有意义 否则还是应当优先考虑使用合成而不是继承 因为依赖于对象合成技术的设计有更好的重用性或更简单 简而言之 面向对象 对象 类 继承 消息 第三章面向对象程序设计的基本概念 3 5多态 多态的意思是具有多种形态 它是面向对象程序设计的重要思想方法 多态在面向对象程序设计中意味着通过动态绑定原理 使用单个变量来引用不同类的对象 自动调用引用对象类的对应方法 动态绑定机制 可以在运行期判定对象的类型 并调用其相应的方法 也就是说 编译器无需知道对象的类型 但方法的绑定和调用机制能够找出正确的方法体并加以调用 同名方法的覆盖 override 和重载 overload 是两种完全不同的机制 替代原则 substitutionprinciple 基类应该可以用其派生类代换 替代过程也是派生类向上转型的过程 向上转型是一种常用的安全的类型转换 通过向上转型可实现多态性 3 5 1多态与动态绑定 派生类的对象具有多个类型动态绑定实现多态 publicintgain intg input 2 收益是投入的两倍returng 覆盖 override fruits i gain 程序运行时动态确定实现的gain方法 fruits 0 newTropicalFruit 香蕉 1000 fruits 1 newBerry 葡萄 2000 fruits 2 newTropicalFruit 菠萝 2000 fruits 3 newBerry 草莓 1000 fruits 4 newCitrusFruit 橘子 1000 我们可以像对待基类对象那样对待派生类对象 它们的共性表现在继承下来的同名类成员 所有继承于共同基类的派生类对象可以当做是这些基类的对象 FoodmyFood FruitmyFruit CitrusFruitorange orange newCitrusFruit 橘子 1000 创建橘子对象myFood orange 相当于myFood Food orange myFood eat 调用的是CitrusFruit的eat方法 剥皮吃橘子myFruit orange 相当于myFruit Fruit orange myFruit eat 调用的还是CitrusFruit的eat方法 剥皮吃橘子 3 5 2方法的绑定 所谓的方法绑定 Binding 就是建立方法调用 MethodCall 和方法本体 MethodBody 之间的关联 如果方法是 早绑定 先期绑定 的 也就是在编译时编译器就能准确地判断应该调用的那个方法称为静态绑定方法 Java中这类方法包括private static final方法以及构造函数 如果方法是 晚绑定 后期绑定 的 也就是在运行时由虚拟机调用同该对象变量所指对象的实际类型相匹配的方法版本 动态决定的方法 称为动态绑定方法 Java中除了private static final方法以及构造函数外的其他方法都是动态绑定方法 Java语言中使用关键字final来定义常量 但是关键字final还有另外2个重要用途 一个是阻止类 final类 被继承 另一个是阻止方法 final方法 被覆盖 override 抽象方法是一种没有实现的方法 定义有抽象方法的类我们称之为抽象类 抽象方法和抽象类都使用abstract关键字来标识 含有抽象方法的类必须定义为抽象类 但是没有抽象方法的类也可以定义为抽象类 但无论如何 抽象类都不能创建实例 3 6接口 接口的概念是建立在封装的基础之上 在面向对象程序设计中 封装是指对象的使用者通过预先定义的接口关联到某一对象的服务和数据时 无需知道这些服务是如何实现的 因此接口在面向对象程序设计中有着重要的地位 在Java中 抽象类和接口 Interface 都是一种接口抽象机制 符合接口的特点 习惯上我们只把Java语法中的接口 Interface 作为接口的窄定义 该接口是一种类型 它定义了能被一个类实现的方法 3 6 1接口的概念 接口是指一些方法特征的集合 它关心的是方法的特征定义 例如方法的名称 参数的类型及数量 而不是方法的具体实现 在Java中 抽象类和接口都是一种接口抽象机制 符合接口的特点 接口提供了一种抽象机制接口使即插即用变得可能接口针对抽象而不是针对实现 3 6 2Java接口 定义接口实现接口接口与多重继承 public interface接口名 extends祖先接口名 返回类型方法名 参数列表 类型常量字段名 值 public class类名 extends祖先类名 implements接口名 其它接口名 类的实现代码 下面代码通过实现Writeable接口和Eatable接口的Paper类代码 演示了多重继承的程序设计 publicclassPaperimplementsEatable Writeable publicvoideat System out println 撕纸吃 TASTELESS publicvoidwrite System out println 在纸上书写 3 6 3接口应用实例 使用接口的好处是便于系统的扩展 维护和重用 接口的使用使得代码模块之间的耦合减弱 具体表现在对象之间的依赖关系弱化为客户 服务的关系 即客户对象请求服务 服务对象提供服务 而接口则成了提供服务的一种契约 没有经验的程序员设计接口时通常会犯合并接口和预留接口这两个错误 根据接口隔离法则 我们在设计接口时不应该强迫客户端依赖于他们用不上的方法 而是应该提供职责明确 功能专一的最小化接口 除非必要 应该严格控制接口宽度 避免接口冗余 面向对象的特点主要概括为 抽象性继承性多态性封装性 小结 3 7面向对象和对象建模 面向对象方法学是面向对象程序设计技术的理论基础 面向对象程序设计具有符合人类抽象思维的认知习惯 使得程序开发过程与人类的认知过程同步 便于建立规范化的分析设计方法 使程序具有更好的封装性 可读性 可维护性 可重用性等一系列优点 面向对象技术以基本对象模型为单位 将对象内部处理细节封装在模型内部 重视对象模块间的接口联系和对象与外部环境间的联系 能层次清晰地表示对象模型 模型提供了一个物理系统的抽象 模型可以让工程师们忽略无关的细节而把注意力集中到系统的重要部分来进行思考 软件模型除了用于系统设计还可以用在很多的方面 例如预期系统的质量 当系统的某些方面变化时推理特定的属性 测试关键的系统特征等 模型可以先开发出来用于指导物理系统的开发 或者也可以由一个已存在的系统或者开发中的系统产生 作为理解系统行为 优化系统实现的手段 统一建模语言UML是一个通用的可视化建模语言 用于对软件进行描述 可视化处理 构造和建立软件系统制品的文档 3 7 1面向对象基本原理 面向对象技术 正是利用对现实世界中对象的抽象和对象之间相互关联和相互作用的描述来对现实世界进行模拟 并且使其映射到目标系统中 所以面向对象的特点主要概括为抽象性 继承性 封装性和多态性 抽象性 指对现实世界中某一类实体或事件进行抽象 从中提取共同信息 找出共同规律 反过来又把它们集中在一个集合中 定义为所设计目标系统中的对象 继承性 新的对象类由继承原有对象类的某些特性或全部特性而产生出来 原有对象类称为基类 或超类 父类 新的对象类称为派生类 或子类 派生类可以直接继承基类的共性 又允许派生类发展自己的个性 继承性简化了对新的对象类的设计 封装性 是指对象的使用者通过预先定义的接口关联到某一对象的服务和数据时 无需知道这些服务是如何实现的 即用户使用对象时无需知道对象内部的运行细节 这样 以前所开发的系统中已使用的对象能够在新系统中重新采用 减少了新系统中分析 设计和编程的工作量 多态性 是指不同类型的对象可以对相同的激励做出适当的不同相应的能力 多态性丰富了对象的内容 扩大了对象的适应性 改变了对象单一继承的关系 3 7 2建立面向对象的思维 对象是建立面向对象程序所依赖的基本单元 用更专业的话来说 所谓对象就是一种代码的实例 这种代码执行特定的功能 具有自包含或者封装的性质 这种封装代码通常叫做类 封装 的对象具有自己的函数 这种函数被称作 方法 而对象的属性则被称为 字段 当对象内部定义了字段的时候 它们通常不能扩展到实例以外 用于创建对象的类有一种功能强大的特性 这就是它们可以继承其他类 在继承了类后 我们可以通过覆盖 override 方法来获得希望的结果 面向对象强调从问题域的概念到软件程序和界面的直接映射 心理学的研究也表明 把客观世界看成是许多对象更接近人类的自然思维方式 对象比函数更为稳定 软件需求的变动往往是功能相关的变动 而其功能的执行者对象通常不会有大的变动 另外 面向对象的开发也支持 鼓励软件工程实践中的信息隐藏 数据抽象和封装 在一个对象内部的修改被局部隔离 面向对象开发的软件易于修改 扩充和维护 3 7 3UML和对象建模 模型与建模模型提供了一个物理系统的抽象 模型可以让工程师们忽略无关的细节而把注意力集中到系统的重要部分来进行思考 从软件建模技术的发展过程中 人们认识到建模语言是一种图形化的文档描述性语言 利用它可以解决在软件建模
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高校辅导员核心素养提升的策略与实施路径
- 人工智能在高职信息技术课程的教学评估中应用
- 扩大社区养老服务有效供给实施方案
- 英语高一模拟试题及答案
- 公安局驻地反侵袭应急预案
- 电力监控专业考试题及答案
- 第14课 守护精灵-控制逻辑说课稿-2023-2024学年小学信息技术(信息科技)五年级下册清华大学版
- 广告营销专业考试题及答案
- 2024年五年级英语下册 Unit 2 Can I help you Lesson 12说课稿 人教精通版(三起)
- 手表专业测试题目及答案
- 宠物中医理疗保健(山东畜牧兽医职业学院)知到智慧树答案
- 海外医疗旅游咨询与服务合同
- 《广西壮族自治区房屋建筑和市政工程施工招标文件范本(2023年版)》
- 2024-2030年台湾家具行业市场竞争格局及投资规划分析报告
- 中国石油联营协议合同范本
- 中医体质分型
- T-CNLIC 0113-2023 母婴洗碗机技术要求和试验方法
- 标书内技术服务和售后服务方案
- 《中国特色社会主义道路的开辟与发展》部优课件
- 2024下肢软组织损伤修复指南要点(全文)
- 初中国学诵读教案
评论
0/150
提交评论