面向对象编程的基本概念.ppt

上传人:本田雅阁 文档编号:2264905 上传时间:2019-03-13 格式:PPT 页数:48 大小:1.92MB
返回 下载 相关 举报
面向对象编程的基本概念.ppt_第1页
第1页 / 共48页
面向对象编程的基本概念.ppt_第2页
第2页 / 共48页
面向对象编程的基本概念.ppt_第3页
第3页 / 共48页
亲,该文档总共48页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《面向对象编程的基本概念.ppt》由会员分享,可在线阅读,更多相关《面向对象编程的基本概念.ppt(48页珍藏版)》请在三一文库上搜索。

1、第三章 面向对象程序设计基本概念,面向对象的程序设计(OOP)已成为现代软件开发的必然选择。通过掌握面向对象的技术,能开发出复杂、高级的系统,这些系统是完整健全的,但又是可扩充的。OOP是建立在把对象作为基本实体看待的面向对象的模型上的,这种模型可以使对象之间能相互交互作用。 面向对象程序设计在一个好的面向对象程序设计语言(OOPL)的支持下能得到最好的实现。Java就是一种优秀的OOPL,它提供了用来支持面向对象程序设计模型所需的一切条件。Java有自己完善的对象模型,并提供了一个庞大的Java类库,并有一套完整的面向对象解决方案和体系结构。 本章介绍面向对象的概念和对象建模的方法,讲解Ja

2、va对象模型中的核心部分:类及类的成员。使读者学会如何用创建和使用Java对象。,2,3.1 对象,定义:一个对象就是变量和相关方法的封装,其中变量表明对象的状态,方法表明对象的行为。软件对象既可以模拟现实世界的对象,也可以表示抽象的概念,对象示意图,3,3.1 对象,封装: 能把对别的对象来说并不重要的对象的实现细节隐蔽起来 ,在使用一个对象时,只需知道怎样引用它的方法而无须知道它的具体实现。 封装的优点: 模块化一个对象的源代码的编写和维护独立于其它对象的源代码。而且,对象在系统中很容易使用。 信息隐蔽每个对象都有一个公共接口使得其它对象可以与其通讯。但对象能维护自己的私有信息和方法并能在

3、任何时候改变它们而不会影响使用它的其它对象。,3.1 对象 (SmallTalk的特征),(1) 所有东西都是对象。可将对象想象成一种新型变量;它保存着数据,但可要求它对自身进行操作。 (2) 程序是一大堆对象的组合;通过消息传递,各对象知道自己该做些什么。 (3) 每个对象都有自己的存储空间,可容纳其他对象。 (4) 每个对象都有一种类型。根据语法,每个对象都是某个“类”的一个“实例”。其中,“类”(Class)是“类型”(Type)的同义词。一个类最重要的特征就是“能将什么消息发给它?” (5)同一类所有对象都能接收相同的消息。,3.1 对象,理解对象 使用对象 对象之间的关系,面向对象程

4、序设计中的对象与客观世界中的对象并不是完全相同的概念,他们既有联系又有区别。所以深刻理解编程中的对象本质将有利于实践面向对象编程和开发。,3.1.1 理解对象,对象可以视为一组相关的操作代码和数据的组合 对象是类的实例 对象可以互相协作,共同完成任务 通过继承、组合或封装等方式可以产成新的对象 对象根据特定的意义和用途有不同的划分方法,3.1.2 使用对象:设计果园系统,一个面向对象的果园系统 假设我们要开发一个最简单的果园系统GardenSys。用面向对象的方法来分析,这个果园系统至少包括园丁和水果这两个对象。园丁的工作包括种植各种水果,水果的行为包括生长和收获,不同的水果还有不同的名称。园

5、丁种植水果,园丁与水果存在关联关系。,3.1.2 使用对象:对象的创建和销毁,对象是通过类创建的,对象是类的动态实例。每个对象都有生命期。一个对象按其生命期来分析,一般有三个阶段,出生、活动、死亡。而我们在编程中要做的对应为:创建(初始化)、运行、销毁。 通常,当调用构造函数时,该函数返回一个新分配内存并初始化了的类的实例。 Java构造函数是一种比较特殊的函数,它不能由用户来指定返回类型,只能返回所属类的类型;它也不能由用户来指定其它名称,只能使用与类名相同的名称。即便如此,我们仍然可以通过方法的重载(overload)来为一个类提供多个不同的构造函数。 在Java中没有用于销毁和清理对象的

6、析构函数,因为Java提供了垃圾回收(Garbage Collection,简称gc)机制负责释放对象所占用的内存空间及相关的其它资源。,3.1.2 使用对象:对象和对象变量,从语义上讲,对象是类的实例,类是创建对象的模板;从语言上讲,对象也是类这种数据类型的变量,对象在内存中占有空间。但是在具体使用中,对象与传统的变量,也就是Java中基本类型的变量有区别。 对象是一种引用类型。对象由类创建,存储在堆中;而对象变量则是对象的引用,存储在栈中。在程序中我们通过对象变量,也就是对象的引用,来操纵对象。,引用类型的演示: MyClass a,b;/声明MyClass类型的变量a和b,MyClass

7、是一个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”) 依

8、赖关系(“usea”),面向对象程序设计的高效关键在于它让每个对象负责执行一组相关的任务。如果对象依赖于其他对象负责处理的任务,那么它就去访问负责这个任务的对象。这时第一个对象就请求第二个对象执行任务,即这个对象依赖于另一个对象。另外,一个对象不能直接操作另一个对象内部的数据,它也不应让其他对象直接访问自己的数据。所有的通信都应该通过方法调用来完成。通过对对象数据的封装,就可以使可重用性最大化,减少数据依赖,并且使调试时间最小化。当然,就像面向过程语言中的模块一样,不应该让一个对象负责过多的事情。创建完成少量任务、规模较小的对象会使设计和调试过程都变得较为简单,相反,创建数据复杂、函数众多的对

9、象,则会使开发过程变得极为复杂。 因此理解对象之间的关系可以帮助我们设计出可重用、易维护的代码,降低耦合性,提高灵活性。,11,3.2 什么是消息,对象间相互作用和互相通讯是通过发送消息来实现的。当对象A让对象B执行它的某个方法时,对象A就要向对象B发送消息。,12,3.2 什么是消息,一个消息通常包括三部分: 接受消息的对象 接受消息的对象应执行的方法 方法所需要的参数 消息模式的优点: 利用对象的方法来表示对象的行为,收发消息能支持对象间所有可能的交互作用。 收发消息的对象无须在同一个进程里,甚至无须在同一个机器里。,13,3.3 什么是类,定义:类是一类对象的抽象或原形,它定义了该类对象

10、的共同的状态和方法 类和对象的区别: 类:是一类对象的原形,是对该类对象的抽象。 对象:是某个类的一个实例,是客观存在并能够使用的。 类的优点: 有效地支持了软件重用。程序员使用一个类可以反复创建多个对象。,第三章 面向对象程序设计的基本概念,3.3 类,例如:对于园丁所种植的香蕉、橘子、葡萄等不同的水果对象,它们有共同的名称属性,以及种植和收获的操作,因此可将它们划归为果园系统中的水果类。,3.3.1 什么是Java类,当用户编写自己的Java程序时,主要工作就是编写类。当程序运行时,已声明的类用来创建新对象。由类创建对象的过程称为实例化(instantiation),每个对象都是类的一个新

11、实例(instance)。 类是一种抽象数据类型,在Java中类也被当作一个数据类型来定义。类的语法结构包括关键字class、跟在后面的类名称。如果其继承自某个基类,还需要使用extends关键字加基类名称。 类通常不需要从头生成。相反,他们可以从其他的类派生而来,继承祖先类的可用类成员,包括:字段、方法等。即使是从头创建的新类也必须是继承自Object类,只不过我们可以合法省略extends Object而已。,class 类名 extends 基类 /类的函数成员 构造函数1; 构造函数2; . 方法1; 方法2; . /类的数据成员 字段1; 字段2; . ,3.3.2 类成员,类成员包

12、括数据成员和函数成员。 数据成员是面向对象的术语,用于表示类中的数据变量,即Java中的字段(field)。 函数成员也是面向对象的术语,用于表示类中的操作。Java的函数成员包括方法和构造函数: 方法是一些封装在类中的过程和函数,用于执行类的操作,完成类的任务。 构造函数是一种特殊的方法,用于对象的创建和初始化。,3.3.3 类成员的可访问性,类成员包括数据成员和函数成员,类的每个成员都有一个称为可访问性的属性,用来保护类成员。Java有四种类成员的保护方式,分别为缺省的、public(公有的)、protected(保护的)、private(私有的)。 为了使程序具有良好易读的风格,建议最好

13、在撰写类代码时用不同的可访问性来组织类成员,并将public成员作为对外公布的接口放在最前面,以便引起关注。,3.3.4 方法,方法是在类中定义,用来实现对象操作的过程或者函数。方法是类的成员,并有自己的可访问性。Java程序中,方法的声明和方法的实现是分开的。 方法与普通函数和过程不同,方法只应用于特定类及其祖先类的对象。另外,每一个方法都有一个隐含的参数,称为this,它引用作为方法调用主体的对象。调用一个方法的语法格式是:对象名.方法名(实际参数); 实例字段和实例方法是属于某一具体实例对象的字段和方法,必须先创建这个实例对象,然后才能使用这些字段和方法。对于同一个类创建的不同的实例对象

14、,其字段可以有不同的取值,以反映该对象的不同状态。 除此之外,还有一种通过类就可以直接访问的静态字段和静态方法,这种静态的字段和方法用static关键字标识,不需要创建实例就可以通过类直接访问。,19,3.4 什么是继承,定义:利用现有的类(supperclass)定义新的类(subclass), 子类可以继承父类的属性和方法并可以增加新的属性和方法或重载父类的方法。 对象的继承是一种在保持对象差异性的同时共享对象相似性的复用。它是源自类的泛化机制。这种抽象机制允许类之间共享代码,大大减少了代码长度并且使软件易于维护。对象通过继承,保证了实现部分紧内聚和松耦合的良好特性。,第三章 面向对象程序

15、设计的基本概念,3.4 什么是继承,第三章 面向对象程序设计的基本概念,继承的优点: 子类提供了基于父类公共部分的更具体的行为。利用继承子类可以重用父类多次; 可以定义一个称为抽象类的父类来定义一般行为。,21,3.4 什么是继承,交通工具,汽车,卡车,旅行车,小汽车,轿车,跑车,面包车,基类/ 祖先类,父类/子类/派生类,子类/派生类,第三章 面向对象程序设计的基本概念,3.4.1 使用继承,基类与派生类 Java中派生类通过extends关键字继承基类,并通过super关键字访问基类的构造函数和方法。 Java中所有的类都继承了Object类的toString方法,我们可以重写并覆盖toS

16、tring方法,使之带有对象的具体信息,以便我们跟踪和调试对象。 继承关系形成了树状的类层次结构。继承产生的派生类不能直接访问其基类的private成员,但所有其他基类成员通过继承成为派生类的成员后,保持它们原来的成员的可访问性,并可在派生类中使用。,面积 = length width,周长 = 2 (length + width),Square需要重写并覆盖基类的calcPerimeter方法来计算周长。 周长 = 4 length,Square可以继承基类Rectangle的calcArea方法来计算面积,无须另写代码,图 42在这个UML类图中,Square继承了Rectangle,是R

17、ectangle类的扩展,示例程序 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 + “的长

18、方形“; 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 使用继承,基类与派生类 继承在果园系统中的使用

19、,3.4.2 继承与合成,面向对象程序设计中,通过合成或通过继承都可以在不同的环境中重用已有的设计和实现。但经验表明,除非所有继承的方法都有意义,否则还是应当优先考虑使用合成而不是继承。因为依赖于对象合成技术的设计有更好的重用性或更简单。,简而言之: 面向对象=对象+类+继承+消息,第三章 面向对象程序设计的基本概念,3.5 多态,多态的意思是具有多种形态,它是面向对象程序设计的重要思想方法。多态在面向对象程序设计中意味着通过动态绑定原理,使用单个变量来引用不同类的对象,自动调用引用对象类的对应方法。 动态绑定机制,可以在运行期判定对象的类型,并调用其相应的方法。也就是说,编译器无需知道对象的

20、类型,但方法的绑定和调用机制能够找出正确的方法体并加以调用。 同名方法的覆盖(override)和重载(overload)是两种完全不同的机制。 替代原则(substitution principle):基类应该可以用其派生类代换。替代过程也是派生类向上转型的过程。向上转型是一种常用的安全的类型转换,通过向上转型可实现多态性。,3.5.1 多态与动态绑定,派生类的对象具有多个类型 动态绑定实现多态,public int gain() int g=input*2;/收益是投入的两倍 return g; ,覆盖(override),fruitsi.gain(); 程序运行时动态确定实现的gain方

21、法,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 or

22、ange; 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)之

23、间的关联。如果方法是“早绑定”、“先期绑定”的,也就是在编译时编译器就能准确地判断应该调用的那个方法称为静态绑定方法。Java中这类方法包括private、static、final方法以及构造函数。如果方法是“晚绑定”、“后期绑定”的,也就是在运行时由虚拟机调用同该对象变量所指对象的实际类型相匹配的方法版本,动态决定的方法,称为动态绑定方法。Java中除了private、static、final方法以及构造函数外的其他方法都是动态绑定方法。 Java语言中使用关键字final来定义常量。但是关键字final还有另外2个重要用途:一个是阻止类(final类)被继承,另一个是阻止方法(final方

24、法)被覆盖(override)。 抽象方法是一种没有实现的方法。定义有抽象方法的类我们称之为抽象类。抽象方法和抽象类都使用abstract关键字来标识。含有抽象方法的类必须定义为抽象类,但是没有抽象方法的类也可以定义为抽象类。但无论如何,抽象类都不能创建实例。,3.6 接口,接口的概念是建立在封装的基础之上。在面向对象程序设计中,封装是指对象的使用者通过预先定义的接口关联到某一对象的服务和数据时,无需知道这些服务是如何实现的。因此接口在面向对象程序设计中有着重要的地位。 在Java中,抽象类和接口(Interface)都是一种接口抽象机制,符合接口的特点。习惯上我们只把Java语法中的接口(I

25、nterface)作为接口的窄定义。该接口是一种类型,它定义了能被一个类实现的方法。,3.6.1 接口的概念,接口是指一些方法特征的集合,它关心的是方法的特征定义(例如方法的名称、参数的类型及数量),而不是方法的具体实现。在Java中,抽象类和接口都是一种接口抽象机制,符合接口的特点。 接口提供了一种抽象机制 接口使即插即用变得可能 接口针对抽象而不是针对实现,3.6.2 Java接口,定义接口 实现接口 接口与多重继承,public interface 接口名 extends 祖先接口名 返回类型 方法名(参数列表); . 类型 常量字段名 = 值; . ,public class 类名 e

26、xtends 祖先类名 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 接口应用实例,使用接口的好处是便于系统的扩展、维护和重用。接口的使用使得代码

27、模块之间的耦合减弱。具体表现在对象之间的依赖关系弱化为客户服务的关系,即客户对象请求服务,服务对象提供服务,而接口则成了提供服务的一种契约。 没有经验的程序员设计接口时通常会犯合并接口和预留接口这两个错误。根据接口隔离法则,我们在设计接口时不应该强迫客户端依赖于他们用不上的方法,而是应该提供职责明确、功能专一的最小化接口。除非必要,应该严格控制接口宽度,避免接口冗余。,面向对象的特点主要概括为: 抽象性 继承性 多态性 封装性,小结:,3.7 面向对象和对象建模,面向对象方法学是面向对象程序设计技术的理论基础。面向对象程序设计具有符合人类抽象思维的认知习惯,使得程序开发过程与人类的认知过程同步

28、,便于建立规范化的分析设计方法,使程序具有更好的封装性、可读性、可维护性、可重用性等一系列优点。 面向对象技术以基本对象模型为单位,将对象内部处理细节封装在模型内部,重视对象模块间的接口联系和对象与外部环境间的联系,能层次清晰地表示对象模型。 模型提供了一个物理系统的抽象,模型可以让工程师们忽略无关的细节而把注意力集中到系统的重要部分来进行思考。软件模型除了用于系统设计还可以用在很多的方面,例如预期系统的质量、当系统的某些方面变化时推理特定的属性、测试关键的系统特征等。模型可以先开发出来用于指导物理系统的开发,或者也可以由一个已存在的系统或者开发中的系统产生,作为理解系统行为、优化系统实现的手

29、段。统一建模语言UML是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。,3.7.1 面向对象基本原理,面向对象技术,正是利用对现实世界中对象的抽象和对象之间相互关联和相互作用的描述来对现实世界进行模拟,并且使其映射到目标系统中。所以面向对象的特点主要概括为抽象性、继承性、封装性和多态性。 抽象性指对现实世界中某一类实体或事件进行抽象,从中提取共同信息,找出共同规律,反过来又把它们集中在一个集合中,定义为所设计目标系统中的对象。 继承性新的对象类由继承原有对象类的某些特性或全部特性而产生出来,原有对象类称为基类(或超类、父类),新的对象类称为派生类(或子

30、类),派生类可以直接继承基类的共性,又允许派生类发展自己的个性。继承性简化了对新的对象类的设计。 封装性是指对象的使用者通过预先定义的接口关联到某一对象的服务和数据时,无需知道这些服务是如何实现的。即用户使用对象时无需知道对象内部的运行细节。这样,以前所开发的系统中已使用的对象能够在新系统中重新采用,减少了新系统中分析、设计和编程的工作量。 多态性是指不同类型的对象可以对相同的激励做出适当的不同相应的能力。多态性丰富了对象的内容,扩大了对象的适应性,改变了对象单一继承的关系。,3.7.2 建立面向对象的思维,对象是建立面向对象程序所依赖的基本单元。用更专业的话来说,所谓对象就是一种代码的实例,

31、这种代码执行特定的功能,具有自包含或者封装的性质。这种封装代码通常叫做类 。 “封装”的对象具有自己的函数,这种函数被称作“方法”,而对象的属性则被称为“字段”。当对象内部定义了字段的时候,它们通常不能扩展到实例以外。 用于创建对象的类有一种功能强大的特性,这就是它们可以继承其他类。 在继承了类后,我们可以通过覆盖(override)方法来获得希望的结果。 面向对象强调从问题域的概念到软件程序和界面的直接映射;心理学的研究也表明,把客观世界看成是许多对象更接近人类的自然思维方式。对象比函数更为稳定;软件需求的变动往往是功能相关的变动,而其功能的执行者对象通常不会有大的变动。另外,面向对象的开发

32、也支持、鼓励软件工程实践中的信息隐藏、数据抽象和封装。在一个对象内部的修改被局部隔离。面向对象开发的软件易于修改、扩充和维护。,3.7.3 UML和对象建模,模型与建模 模型提供了一个物理系统的抽象,模型可以让工程师们忽略无关的细节而把注意力集中到系统的重要部分来进行思考。从软件建模技术的发展过程中,人们认识到建模语言是一种图形化的文档描述性语言,利用它可以解决在软件建模过程中存在的沟通障碍问题。,3.7.3 UML和对象建模,统一建模语言UML是一个通用的可视化建模语言,用于对软件进行描述、可视化处理、构造和建立软件系统制品的文档。它可以把人们对所需要构建系统的想法和理解记录下来,以便用于对

33、系统的分析、设计、研究、配置和维护。,关联关系,泛化关系 (继承关系),字段,方法,类名称,可见性 ( - # + ),3.7.3 UML和对象建模,使用建模工具 建模工具的出现提高了建模的生产力。一个优秀的建模工具应该能够完成模型与代码之间的自动转换,也可以保持设计模型与实现代码在变更时的步调一致。,3.8. 1传统软件开发方法存在的问题 软件生产率低 软件重用程度低 软件维护艰辛 软件非用户所需,3.8 软件开发的方法,第三章 面向对象程序设计的基本概念,3.8.2 存在的问题的原因 传统结构化技术的缺点 软件结构分析与结构设计技术的本质是功能分解,是围绕实现处理功能的过程来构造系统的。结

34、构化方法强调过程抽象和模块化,是以过程(或操作)为中心来构造系统和设计程序的。 然而用户需求的变化大部分是针对加工的,因此这种变化对基于过程的设计来说是灾难 。,3.8 软件开发的方法,3.8.3 软件工程的新途径 面向对象作为一种思想及编程语言,为软件开发的整个过程:从分析设计到实现,提供了一个完整解决方案。面向对象堪称是软件发展取得的里程碑式的伟大成就。 面向对象方法简介 从80年代后期开始,进行了面向对象分析(OOA)、面向对象设计(OOD)和面向对象程序设计(OOP)等新的系统开发方式模型的研究,在有些文献中统称为OO范型。,3.8 软件开发的方法,44,3.8 软件开发的方法,结构化

35、程序设计方法是: 程序=(算法)+(数据结构),主函数,函数1,函数1-1,函数2,函数3,函数1-2,函数2-1,函数3-1,函数3-2,数据1,数据3,数据2,45,3.8 软件开发的方法,面向对象程序设计方法是: 对象=(算法+数据结构) 程序=(对象+对象+) 算法与数据结构是一个整体,算法离不开数据结构,算法只能适用于特定的数据结构。 在面向对象中,算法与数据结构被捆绑成一个类,3.9面向对象程序设计原则和方法,面向对象程序设计的重要原则有: 分而治之原则 封装原则 接口原则 信息隐藏原则 一般性原则 可扩展性原则 抽象原则,3.9面向对象程序设计原则和方法,面向对象在程序设计中实现的方法: 分解与封装 继承与合成 接口与实现 服务与客户,3.10 面向对象软件开发过程(软件生命周期),

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1