单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第三讲,面向对象程序设计基本概念,任何一种思想和方法,都会引入一套术语和概念,用于刻画该思想和方法的原理。,面向对象方法是一种运用对象、类、继承、封装、多态、聚合、关联等构造软件的开发方法。,对象,:,对象是个自包含的实体,用一组可识别的属性和行为来标示。,要在软件中刻画对象,可以利用一个或者多个变量来刻画它的状态,用若干个函数或子程序来刻画对象的行为。,具有相同特征(静态特征和动态特征)的多个对象可以归为一类。,类,是一组具有相同特征的对象的抽象描述,它定义了该类对象的共同的特征。,对象的抽象是类,类的具体化就是对象,。,实例,是一个真实的对象。,封装,、,继承,和,多态,是面向对象的三大基本特征。,结构化与面向对象的对比,旧软件观,软件是用来指挥与控制硬件设备,面向程序软件是主动的,用户依软件预订的程序来做事,软件是一群函数的集合,函数之间互相调用与通信,软件的设计是极具艺术及创造性的工作,新软件观,软件是用来模拟与表达现实世界中错综复杂的对象关系,面向消息的软件像马匹,听从用户的消息,二提供服务,软件是一群对象的集合,对象可分门别类,可互相传送消息,对象设计仍是极具创造性的工作,但对象是软件的组件,可由对象大量装配而成。,面向对象的基本特征,封装,,简单地说,就是把客观事物封装成抽象的类,其目的是为了简化编程和增强安全性。使用者不必了解具体的类的实现细节,只通过外部接口来使用类的成员。这样,方法和属性包装在类中,通过类的实例来实现。,封装对设计和实现程序有很多好处:,(,1,)良好的封装机制能够减少耦合;,(,2,)类内部的实现可以自由地修改;,(,3,)类具有清晰的接口。,继承,:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对其功能进行扩展。通过继承所创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。,继承的过程实质上就是从一般到特殊的过程,即继承代表一种“,is-a”,的关系。如果有两个对象,A,与,B,可以被描述为,B,是,A,的一种,就表明,B,可以继承,A,。,从另一个角度,继承者也可以理解为是对被继承者的特殊化,因为它除了具备被继承者的特性外,还具备自身独有的性质。,使用继承机制的优点是继承使得所有子类公共的部分都放在父类中,使得这些代码可以共享,避免了重复编写代码;而且,继承使得修改或扩展子类都较为容易。,多态性,的定义是:同一操作作用于不同的类的实例,将产生不同的执行结果。,多态性是允许将父对象设置成为和一个或更多其子对象相等的技术。赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承关系最底层的子类的方法实现会被调用。,要实现多态,有两种方式:,覆盖,和,重载,。覆盖是指子类重新定义父类的虚函数的做法;重载是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类)。它们的目的都是为了代码重用。多态是为了接口重用,这样也就增强了软件的灵活性和重用性。,类之间存在的关系,(,1,),泛化关系,(,Generalization,),泛化关系表示类与类之间的继承关系,接口与接口间的继承关系或者类对接口的实现关系。,泛化关系在,Java,语言中可以使用关键字,extends,和,implements,,其中,extends,描述类与类、接口与接口之间的泛化关系,,implements,描述与接口之间的泛化关系。,(,2,),关联关系,(Association),所谓关联就是某个对象会长期的持有另一个对象的引用,而二者的关联往往也是相互的。关联的两个对象彼此间没有任何强制性的约束,只要二者同意,可以随时解除关系或是进行关联,它们在生命期问题上没有任何约定。被关联的对象还可以再被别的对象关联,所以关联是可以共享的。例如人与人之间的好友关系。,关联关系往往可以进一步确定为,聚合,(,Aggregation,)关系或者,合成,(,Composition,)关系。,类之间存在的关系,(,3,),聚合关系,(Aggregation),聚合关系是关联关系的一种,表示整体与个体之间的一种弱的“拥有”的关系。,关联关系所涉及的两个类是处于同一层次上的;而在聚合关系中,两个类处在不平等的层次上的,一个代表整体,一个代表部分。,类之间存在的关系,(,4,)合成,/,组合,关系,(Composition),合成关系,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分的对象的生命周期,并且合成关系是不能共享的,代表整体的对象需要负责保持对象的存活。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,合成关系代表部分的对象在每一个时刻只能与一个对象发生合成关系,由后者排它的负责其生命周期。,(,5,)依赖关系(,Dependency,),此关系最为简单,也最好理解,所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。依赖关系是类与类之间的连接,它代表一个类依赖于另一个类的定义。,uses a,类之间存在的关系,依赖关系,dependency,关联关系,association,聚合关系,aggregation,组合关系,composition,实现,realization,泛化,generalization,练习,人是由四肢和躯干组成,这是属于哪种关系。,把学校,学院,系,班级,学生,教师,辅导员,行政人员,班干部,这些实体进行抽象,并画出它们之间的类关系图。,统一建模语言(,UML,),一旦决定使用对象,就需要某种方式把它们表示出来,以便描述和分析。统一建模语言,UML,可以实现这样的功能,它是说明、可视化、构造和文档化软件系统的语言,也是一种定义良好、易于表达、功能强大的通用建模语言,它提供了一种机制使得不同的开发人员之间可以有效地共享和交流。,UML,提供了多种图,常用的包括:类图、序列图、对象图、用例图、状态图、部署图。,一个图就是系统架构在某一方面的表示,每一种,UML,的视图就是由一个或多个图组成,所有的图共同组成系统的一组完整视图,这组视图被称为一个模型(,Model,)。,模型是对现实系统的一种抽象,反映了现实系统中最主要的方面,是理解、分析、开发现实系统的一种最常用的方式。,UML,的常用图,类图:类图是,UML,图中最基本的图。它既可以描述类和接口,也可以表示类之间的关系。,在类图中,不同类之间、类与接口之间的多种关系也是可以表达的。,图,4-9 Point,、,Line,和,Square,类继承,Shapes,类,关联关系是类与类之间的连接,它使一个类知道另一个类的属性和方法。关联既可以是双向的,又可以是单向的。单向的关联更普遍,使用一个箭头表示关联的方向。每一个关联都有两个端点,端点可以有一个角色名,显出关联的对象。在每一个关联的端点,还可以有基数(,cardinality,),表明这一端的类有几个实例,.,图,4-10,聚合关系的实例,图,4-11,合成关系的实例,对象图(,Object Diagrams,),对象是一个类的实例,是具有具体属性值的一个事物。对象的表示也是一个矩形,但与类的表示的不同之处在于对象名下面要带下划线。,图,4-12,对象图的表示形式,序列图(,Sequence Diagrams,),类图表示了类之间的静态关系,换句话说,类图没有表示任何行为活动。可以用来表示对象之间如何交互的,UML,图称为交互图(,Interaction Diagrams,),交互图中最常见的是序列图。序列图按照时间顺序自顶向下显示每个使用案例,表示对象之间动态合作的关系。,用例图(,Use Case Diagrams,),用例是从用户的观点对系统行为的一个描述。,用例图则从用户的角度出发描述系统的功能、需求,展示系统外部的各类角色与系统内部的各种用例之间的关系。,用例图包含多个模型元素,这些模型元素包括系统、参与者和用例,并且用例图也显示这些元素之间存在的各种关系。,图,4-14,自动售货机的一个用例模型,状态图(,Statechart Diagrams,),状态图是对类的描述的补充。它用于显示类的对象在一个生命周期实例期间能够具备的所有可能状态,以及那些引起状态改变的事件。,图,4-15,电梯运行的状态图,合作图(,Collaboration Diagrams,),合作图描述对象之间的协作关系,也是交互图的一种。除了显示消息的交互外,合作图也显示对象及它们之间的关系。,在实际建模时,选择使用顺序图还是合作图通常由工作的主要目标来决定。如果需要重点强调时间或顺序,那么选择顺序图;如果需要重点强调对象之间的关系,那就选择合作图。两种图都用于显示对象之间的交互。,图,4-16,某打印服务器的合作图,部署图(,Deployment Diagrams,),UML,部署图显示了基于计算机系统的物理体系结构。它可以描述计算机,展示它们之间的连接,以及驻留在每台机器中的软件。每台计算机用一个立方体表示,立方体之间的连线表示这些计算机之间的通信关系。,图,4-17,部署图实例,活动图(,Activity Diagrams,),活动图是状态图的一种特殊情况,它用于显示一系列顺序的活动,可以捕获动作(把那些将被执行的工作和活动当做可执行的活动结点来建模)及它们的结果(用对象状态的变化来表示)。,活动图可以用于不同的目的,包括:显示一组相关的动作将如何执行,以及它们将怎样影响周围的对象;显示一个用例的实例在动作和对象状态变化方面是如何执行的;显示一个业务在参与者、工作流程、组织和对象等方面是如何运转的。,图,4-18,活动图的例子,组件图(,Component Diagrams,),组件图是根据系统的代码组件来显示系统代码的物理结构。其中,组件可以是源代码组件、二进制组件或可执行组件。组件包含了它所实现的一个或多个逻辑类的相关信息,因此也就创建了一个从逻辑视图的映射。根据组件图中显示的那些组件之间的依赖关系,可以很容易地分析出其中某个组件的变化将会对其它组件产生什么样的影响。,包图(,Package Diagrams,),包提供一种用于组织各种,UML,元素的分组机制。在,UML,中,包用来对元素进行分组,并为这些分组元素提供一个名称空间。包所拥有的或引用的所有模型元素称为包的内容。作为用于模型组织结构的一种分组机制,包没有实例。因此,包通常在建模工作阶段有意义,没必要转换到可执行的系统中。一个包拥有它的模型元素,并且一个模型元素不能被一个以上的包所拥有。如果从模型中删除一个包,那么这个包所拥有的元素也将被删除,.,