面向对象编程的基本概念.ppt_第1页
面向对象编程的基本概念.ppt_第2页
面向对象编程的基本概念.ppt_第3页
面向对象编程的基本概念.ppt_第4页
面向对象编程的基本概念.ppt_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 面向对象程序设计基本概念 面向对象的程序设计(OOP)已成为现代软件开发的 必然选择。通过掌握面向对象的技术,能开发出复杂、 高级的系统,这些系统是完整健全的,但又是可扩充的 。OOP是建立在把对象作为基本实体看待的面向对象的 模型上的,这种模型可以使对象之间能相互交互作用。 面向对象程序设计在一个好的面向对象程序设计语言 (OOPL)的支持下能得到最好的实现。Java就是一种优 秀的OOPL,它提供了用来支持面向对象程序设计模型所 需的一切条件。Java有自己完善的对象模型,并提供了 一个庞大的Java类库,并有一套完整的面向对象解决方 案和体系结构。 本章介绍面向对象的概念和对象建模的方法,讲解 Java对象模型中的核心部分:类及类的成员。使读者学 会如何用创建和使用Java对象。 2 3.1 对象 n 定义:一个对象就是变量和相关方法的封装,其中 变量表明对象的状态,方法表明对象的行为。软件对 象既可以模拟现实世界的对象,也可以表示抽象的概 念 对象示意图 3 3.1 对象 n 封装: 能把对别的对象来说并不重要的对象的实现细 节隐蔽起来 ,在使用一个对象时,只需知道怎样引用它 的方法而无须知道它的具体实现。 n封装的优点: 模块化一个对象的源代码的编写和维护独立于其它 对象的源代码。而且,对象在系统中很容易使用。 信息隐蔽每个对象都有一个公共接口使得其它对象 可以与其通讯。但对象能维护自己的私有信息和方法 并能在任何时候改变它们而不会影响使用它的其它对 象。 n3.1 对象 (SmallTalk的特征) l(1) 所有东西都是对象。可将对象想象成一种新型变 量;它保存着数据,但可要求它对自身进行操作。 l(2) 程序是一大堆对象的组合;通过消息传递,各对 象知道自己该做些什么。 l(3) 每个对象都有自己的存储空间,可容纳其他对象 。 l(4) 每个对象都有一种类型。根据语法,每个对象都 是某个“类”的一个“实例”。其中,“类”(Class )是“类型”(Type)的同义词。一个类最重要的特 征就是“能将什么消息发给它?” l(5)同一类所有对象都能接收相同的消息。 3.1 对象 理解对象 使用对象 对象之间的关系 面向对象程序设计中的对象与客观世界中的对 象并不是完全相同的概念,他们既有联系又有区别 。所以深刻理解编程中的对象本质将有利于实践面 向对象编程和开发。 3.1.1 理解对象 对象可以视为一组相关的 操作代码和数据的组合 对象是类的实例 对象可以互相协作,共同 完成任务 通过继承、组合或封装等 方式可以产成新的对象 对象根据特定的意义和用 途有不同的划分方法 3.1.2 使用对象:设计果园系统 一个面向对象的果园系统 假设我们要开发一个最简单的果园系统GardenSys。用面 向对象的方法来分析,这个果园系统至少包括园丁和水果 这两个对象。园丁的工作包括种植各种水果,水果的行为 包括生长和收获,不同的水果还有不同的名称。园丁种植 水果,园丁与水果存在关联关系。 3.1.2 使用对象:对象的创建和 销毁 对象是通过类创建的,对象是类的动态实例。每个对象都有 生命期。一个对象按其生命期来分析,一般有三个阶段,出 生、活动、死亡。而我们在编程中要做的对应为:创建(初 始化)、运行、销毁。 通常,当调用构造函数时,该函数返回一个新分配内存并初 始化了的类的实例。 Java构造函数是一种比较特殊的函数,它不能由用户来指定 返回类型,只能返回所属类的类型;它也不能由用户来指定 其它名称,只能使用与类名相同的名称。即便如此,我们仍 然可以通过方法的重载(overload)来为一个类提供多个不同 的构造函数。 在Java中没有用于销毁和清理对象的析构函数,因为Java提供 了垃圾回收(Garbage Collection,简称gc)机制负责释放对 象所占用的内存空间及相关的其它资源。 3.1.2 使用对象:对象和对象变 量 从语义上讲,对象是类的实例,类是创建对象的模板;从语言上讲,对象 也是类这种数据类型的变量,对象在内存中占有空间。但是在具体使用中 ,对象与传统的变量,也就是Java中基本类型的变量有区别。 对象是一种引用类型。对象由类创建,存储在堆中;而对象变量则是对象 的引用,存储在栈中。在程序中我们通过对象变量,也就是对象的引用, 来操纵对象。 引用类型的演示: MyClass a,b;/声明MyClass类型的变量a和b,MyClass是一个Java类 a = new MyClass();/变量a引用了MyClass类创建的对象实例 a.myvar = 24;/给对象实例的字段myvar赋值 b = a; /变量b得到的是变量a的一个引用的副本, /结果使他们都引用了同一个对象实例。 a.myvar = a.myvar+1;/改变对象字段的值 System.out.println(a.myvar); /此时显示a.myvar值为25 System.out.println(b.myvar); /此时显示b.myvar值也为25 3.1.3 对象之间的关系 对象之间的关系有: 合成关系(“hasa”) 继承关系(“isa”) 依赖关系(“usea”) 面向对象程序设计的高效关键在于它让每个对象负责执行一组相关的任务。如果对象依 赖于其他对象负责处理的任务,那么它就去访问负责这个任务的对象。这时第一个对象 就请求第二个对象执行任务,即这个对象依赖于另一个对象。另外,一个对象不能直接 操作另一个对象内部的数据,它也不应让其他对象直接访问自己的数据。所有的通信都 应该通过方法调用来完成。通过对对象数据的封装,就可以使可重用性最大化,减少数 据依赖,并且使调试时间最小化。当然,就像面向过程语言中的模块一样,不应该让一 个对象负责过多的事情。创建完成少量任务、规模较小的对象会使设计和调试过程都变 得较为简单,相反,创建数据复杂、函数众多的对象,则会使开发过程变得极为复杂。 因此理解对象之间的关系可以帮助我们设计出可重用、易维护的代码,降低耦合性,提 高灵活性。 11 3.2 什么是消息 n 对象间相互作用和互相通讯是通过发送消息来实现 的。当对象A让对象B执行它的某个方法时,对象A就 要向对象B发送消息。 12 3.2 什么是消息 n 一个消息通常包括三部分: 接受消息的对象 接受消息的对象应执行的方法 方法所需要的参数 n消息模式的优点: 利用对象的方法来表示对象的行为,收发消息能支 持对象间所有可能的交互作用。 收发消息的对象无须在同一个进程里,甚至无须在 同一个机器里。 13 3.3 什么是类 n 定义:类是一类对象的抽象或原形,它定义了 该类对象的共同的状态和方法 n类和对象的区别: 类:是一类对象的原形,是对该类对象的抽象。 对象:是某个类的一个实例,是客观存在并能够 使用的。 n类的优点: 有效地支持了软件重用。程序员使用一个类可 以反复创建多个对象。 第三章 面向对象程序设计的基本概念 3.3 类 例如:对于园丁所种植的香蕉、橘子、葡萄等 不同的水果对象,它们有共同的名称属性, 以及种植和收获的操作,因此可将它们划归 为果园系统中的水果类。 3.3.1 什么是Java类 当用户编写自己的Java程序时,主要工作就是编写类 。当程序运行时,已声明的类用来创建新对象。由类 创建对象的过程称为实例化(instantiation),每个对 象都是类的一个新实例(instance)。 类是一种抽象数据类型,在Java中类也被当作一个数 据类型来定义。类的语法结构包括关键字class、跟在 后面的类名称。如果其继承自某个基类,还需要使用 extends关键字加基类名称。 类通常不需要从头生成。相反,他们可以从其他的类 派生而来,继承祖先类的可用类成员,包括:字段、 方法等。即使是从头创建的新类也必须是继承自 Object类,只不过我们可以合法省略extends Object而 已。 class 类名 extends 基类 /类的函数成员 构造函数1; 构造函数2; . 方法1; 方法2; . /类的数据成员 字段1; 字段2; . 3.3.2 类成员 类成员包括数据成员和函数成员。 数据成员是面向对象的术语,用于表示类中的数 据变量,即Java中的字段(field)。 函数成员也是面向对象的术语,用于表示类中的 操作。Java的函数成员包括方法和构造函数: 方法是一些封装在类中的过程和函数,用于执行类的 操作,完成类的任务。 构造函数是一种特殊的方法,用于对象的创建和初始 化。 3.3.3 类成员的可访问性 类成员包括数据成员和函数成员,类的每个成员都有一 个称为可访问性的属性,用来保护类成员。Java有四种 类成员的保护方式,分别为缺省的、public(公有的) 、protected(保护的)、private(私有的)。 为了使程序具有良好易读的风格,建议最好在撰写类代 码时用不同的可访问性来组织类成员,并将public成员 作为对外公布的接口放在最前面,以便引起关注。 限访问修饰符关键字同一个类中同一个包中派生类中其他包中 public protected 无访问 修饰符关键字 private 3.3.4 方法 方法是在类中定义,用来实现对象操作的过程或者函数。方 法是类的成员,并有自己的可访问性。Java程序中,方法的 声明和方法的实现是分开的。 方法与普通函数和过程不同,方法只应用于特定类及其祖先 类的对象。另外,每一个方法都有一个隐含的参数,称为 this,它引用作为方法调用主体的对象。调用一个方法的语 法格式是:对象名.方法名(实际参数); 实例字段和实例方法是属于某一具体实例对象的字段和方法 ,必须先创建这个实例对象,然后才能使用这些字段和方法 。对于同一个类创建的不同的实例对象,其字段可以有不同 的取值,以反映该对象的不同状态。 除此之外,还有一种通过类就可以直接访问的静态字段和静 态方法,这种静态的字段和方法用static关键字标识,不需要 创建实例就可以通过类直接访问。 19 3.4 什么是继承 n 定义:利用现有的类(supperclass)定义新 的类(subclass), 子类可以继承父类的属性 和方法并可以增加新的属性和方法或重载父类 的方法。 n对象的继承是一种在保持对象差异性的同时共 享对象相似性的复用。它是源自类的泛化机制 。这种抽象机制允许类之间共享代码,大大减 少了代码长度并且使软件易于维护。对象通过 继承,保证了实现部分紧内聚和松耦合的良好 特性。 第三章 面向对象程序设计的基本概念 3.4 什么是继承 第三章 面向对象程序设计的基本概念 继承的优点: 子类提供了基于父类公共部分的更具体的行为。利 用继承子类可以重用父类多次; 可以定义一个称为抽象类的父类来定义一般行为。 21 3.4 什么是继承 交通工具 汽车 卡车旅行车 小汽车 轿车 跑车 面包车 基类/ 祖先类 父类/子类/派生类 子类/派生类 第三章 面向对象程序设计的基本概念 3.4.1 使用继承 1.基类与派生类 Java中派生类通过extends关 键字继承基类,并通过super 关键字访问基类的构造函数和 方法。 Java中所有的类都继承了 Object类的toString方法,我 们可以重写并覆盖toString方 法,使之带有对象的具体信息 ,以便我们跟踪和调试对象。 继承关系形成了树状的类层次 结构。继承产生的派生类不能 直接访问其基类的private成 员,但所有其他基类成员通过 继承成为派生类的成员后,保 持它们原来的成员的可访问性 ,并可在派生类中使用。 面积 = length width 周长 = 2 (length + width) Square需要重写并覆盖基类的 calcPerimeter方法来计算周长。 周长 = 4 length Square可以继承基类Rectangle 的calcArea方法来计算面积,无 须另写代码 图 42在这个UML类图中,Square继承了Rectangle,是Rectangle类的扩展 示例程序 41 Retangle类(Retangle.java) public class Retangle public Retangle(double l, double w) length = l; width = w; public double calcPerimeter() return 2 * (length + width); public double calcArea() return length * width; public String toString() return “长为“ + length + “宽为“ + width + “的长方形“; protected double length; private double width; 示例程序 42 Square类(Square.java) public class Square extends Retangle public Square(double side) super(side,side); public double calcPerimeter() return length * 4; public String toString() return “边长为“ + length + “的正方形“; 3.4.1 使用继承 1.基类 与派生类 2.继承在 果园系统 中的使用 3.4.2 继承与合成 面向对象程序设计中,通过合成或通过继承都可以在 不同的环境中重用已有的设计和实现。但经验表明, 除非所有继承的方法都有意义,否则还是应当优先考 虑使用合成而不是继承。因为依赖于对象合成技术的 设计有更好的重用性或更简单。 简而言之: 面向对象=对象+类+继承+消息 第三章 面向对象程序设计的基本概念 3.5 多态 多态的意思是具有多种形态,它是面向对象程序设计的 重要思想方法。多态在面向对象程序设计中意味着通过 动态绑定原理,使用单个变量来引用不同类的对象,自 动调用引用对象类的对应方法。 动态绑定机制,可以在运行期判定对象的类型,并调用 其相应的方法。也就是说,编译器无需知道对象的类型 ,但方法的绑定和调用机制能够找出正确的方法体并加 以调用。 同名方法的覆盖(override)和重载(overload)是两种 完全不同的机制。 替代原则(substitution principle):基类应该可以用其 派生类代换。替代过程也是派生类向上转型的过程。向 上转型是一种常用的安全的类型转换,通过向上转型可 实现多态性。 3.5.1 多态与动态绑定 1.派生类的对象具有多个类型 2.动态绑定实现多态 public int gain() int g=input*2;/收益是投入的两倍 return g; public int gain() /收益不变 . public int gain() /收益-200 . public int gain() / 收益是投入的3倍 int g = input * 3; System.out.println(fruitName + “投入“ + input + “ 净收益“ + g); return g; 覆盖(override) fruitsi.gain(); 程序运行时动 态确定实现的 gain方法 数组属性索引01234 派生类类型TropicalFruitBerryTropicalFruitBerryCitrusFruit 水果名称香蕉葡萄菠萝草莓橘子 fruits0 = new TropicalFruit(“香蕉“, 1000); fruits1 = new Berry(“葡萄“, 2000); fruits2 = new TropicalFruit(“菠萝“, 2000); fruits3 = new Berry(“草莓“, 1000); fruits4 = new CitrusFruit(“橘子“, 1000); 我们可以像对待基类对象那样对待派生类对象,它们的共 性表现在继承下来的同名类成员。所有继承于共同基类的 派生类对象可以当做是这些基类的对象。 Food myFood; Fruit myFruit; CitrusFruit orange; orange = new CitrusFruit(“橘子“,1000); /创建橘子对象 myFood = orange(); /相当于myFood = (Food)orange; myFood.eat(); /调用的是CitrusFruit的eat方法:剥皮吃橘子 myFruit = orange; /相当于myFruit = (Fruit)orange; myFruit.eat(); /调用的还是CitrusFruit的eat方法:剥皮吃橘子 3.5.2 方法的绑定 所谓的方法绑定(Binding)就是建立方法调用(Method Call)和方 法本体(Method Body)之间的关联。如果方法是“早绑定”、“先期绑 定”的,也就是在编译时编译器就能准确地判断应该调用的那个方法称 为静态绑定方法。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.2 Java接口 1.定义接口 2.实现接口 3.接口与多重继承 public interface 接口名 extends 祖先接口 名 返回类类型 方法名(参数列表); . 类类型 常量字段名 = 值值; . public class 类类名 extends 祖先类类名 implements 接口名 , 其它接口名. /类类的实现实现 代码码 . 下面代码通过实现Writeable接口和Eatable接口 的Paper类代码,演示了多重继承的程序设计 : public class Paper implements Eatable, Writeable public void eat() System.out.println(“撕纸吃 ,“+TASTELESS); public void write() System.out.println(“在纸上书写:“); 3.6.3 接口应用实例 使用接口的好处是便于系统的扩展、维护和重用。接口 的使用使得代码模块之间的耦合减弱。具体表现在对象 之间的依赖关系弱化为客户服务的关系,即客户对 象请求服务,服务对象提供服务,而接口则成了提供服 务的一种契约。 没有经验的程序员设计接口时通常会犯合并接口和预留 接口这两个错误。根据接口隔离法则,我们在设计接口 时不应该强迫客户端依赖于他们用不上的方法,而是应 该提供职责明确、功能专一的最小化接口。除非必要, 应该严格控制接口宽度,避免接口冗余。 面向对象的特点主要概括为: 抽象性 继承性 多态性 封装性 小结: 3.7 面向对象和对象建模 面向对象方法学是面向对象程序设计技术的理论基础。面向对 象程序设计具有符合人类抽象思维的认知习惯,使得程序开发 过程与人类的认知过程同步,便于建立规范化的分析设计方法 ,使程序具有更好的封装性、可读性、可维护性、可重用性等 一系列优点。 面向对象技术以基本对象模型为单位,将对象内部处理细节封 装在模型内部,重视对象模块间的接口联系和对象与外部环境 间的联系,能层次清晰地表示对象模型。 模型提供了一个物理系统的抽象,模型可以让工程师们忽略无 关的细节而把注意力集中到系统的重要部分来进行思考。软件 模型除了用于系统设计还可以用在很多的方面,例如预期系统 的质量、当系统的某些方面变化时推理特定的属性、测试关键 的系统特征等。模型可以先开发出来用于指导物理系统的开发 ,或者也可以由一个已存在的系统或者开发中的系统产生,作 为理解系统行为、优化系统实现的手段。统一建模语言UML是 一个通用的可视化建模语言,用于对软件进行描述、可视化处 理、构造和建立软件系统制品的文档。 3.7.1 面向对象基本原理 面向对象技术,正是利用对现实世界中对象的抽象和对象之间相互关联 和相互作用的描述来对现实世界进行模拟,并且使其映射到目标系统中 。所以面向对象的特点主要概括为抽象性、继承性、封装性和多态性。 抽象性指对现实世界中某一类实体或事件进行抽象,从中提取共同信息 ,找出共同规律,反过来又把它们集中在一个集合中,定义为所设计目标系 统中的对象。 继承性新的对象类由继承原有对象类的某些特性或全部特性而产生出来 ,原有对象类称为基类(或超类、父类),新的对象类称为派生类(或子类 ),派生类可以直接继承基类的共性,又允许派生类发展自己的个性。继承 性简化了对新的对象类的设计。 封装性是指对象的使用者通过预先定义的接口关联到某一对象的服务和 数据时,无需知道这些服务是如何实现的。即用户使用对象时无需知道对象 内部的运行细节。这样,以前所开发的系统中已使用的对象能够在新系统中 重新采用,减少了新系统中分析、设计和编程的工作量。 多态性是指不同类型的对象可以对相同的激励做出适当的不同相应的能 力。多态性丰富了对象的内容,扩大了对象的适应性,改变了对象单一继承 的关系。 3.7.2 建立面向对象的思维 对象是建立面向对象程序所依赖的基本单元。用更专业的话来说 ,所谓对象就是一种代码的实例,这种代码执行特定的功能,具 有自包含或者封装的性质。这种封装代码通常叫做类 。 “封装”的对象具有自己的函数,这种函数被称作“方法”,而对象的 属性则被称为“字段”。当对象内部定义了字段的时候,它们通常 不能扩展到实例以外。 用于创建对象的类有一种功能强大的特性,这就是它们可以继承 其他类。 在继承了类后,我们可以通过覆盖(override)方法来 获得希望的结果。 面向对象强调从问题域的概念到软件程序和界面的直接映射;心 理学的研究也表明,把客观世界看成是许多对象更接近人类的自 然思维方式。对象比函数更为稳定;软件需求的变动往往是功能 相关的变动,而其功能的执行者对象通常不会有大的变动。另外 ,面向对象的开发也支持、鼓励软件工程实践中的信息隐藏、数 据抽象和封装。在一个对象内部的修改被局部隔离。面向对象开 发的软件易于修改、扩充和维护。 3.7.3 UML和对象建模 模型与建模 模型提 供了一个物理系统 的抽象,模型可以 让工程师们忽略无 关的细节而把注意 力集中到系统的重 要部分来进行思考 。从软件建模技术 的发展过程中,人 们认识到建模语言 是一种图形化的文 档描述性语言,利 用

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论