您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 企业文档 > java课件chapter-7-面向对象的几个基本原则解析
Java语言程序设计shelly200607@126.comUML类图简介面向抽象原则开-闭原则多用组合少用继承原则高内聚-低耦合原则主要内容7.1UML类图简介UML(UnifiedModelingLanguage)类图(ClassDiagram)属于结构图,常被用于描述一个系统的静态结构。类图是由若干类关联在一起,反映系统或者子系统组成结构的静态图。类图的建模贯穿工程的分析和设计阶段的始终,通常从用户能够理解的类开始建模,最终往往成为只有开发小组才能够完全理解的类。类图由如下元素组成:•类(Class):是具有共同结构特征、行为特征、联系和语义的对象集合的抽象形式。•关联(Association):它表示类与类之间的关系。在类的UML图中,使用一个长方形描述一个类的主要构成,将长方形垂直地分为三层。◆第1层是名字层◆第2层是变量层,也称属性层,列出类的成员变量及类型,格式是“变量名字:类型”。◆第3层是方法层,也称操作层,列出类的方法及返回类型,格式是“方法名字(参数列表):类型”。7.1.1类的UML图在类图中,根据建模的不同景象,类图标中不一定列出全部的内容。如在建立分析模型或设计模型时,甚至可以只列出类名,在图中着重表达的是类与类之间的联系;在建立实现模型时,则应当在类图标中详细给出类的属性和方法等细节。1.属性属性(Attribute)在UML类图标的矩形框中用文字串说明,如下图所示。可视性(Visibility)标记表示:+公共#保护-私用可视性也可以用以下关键字表示:public(公共)、protected(保护)、private(私用)。•若可视性标记为“+”或“public”,则为公共属性,可以被外部对象访问。•若可视性标记为“#’或“protected”,则为保护属性,可以被本类或子类的对象访问。•若可视性标记为“-”或“private”,则为私用属性,不可以被外部对象访问,只能为本类的对象使用。•可视性可以缺省,表示该属性不可视。Student类属性类型表示:冒号“:”后跟属性值的数据类型。数据类型的表示依赖于实现语言,如有的程序设计语言规定浮点数用保留字“Float”表示,有的则规定用保留字“Real”表示。Student类数据类型可以是任何用户需要的内容,包括:•来自程序设计语言如VisualBasic、C++、C#和Java的任何标准数据类型。•一个已经定义的类。•接口定义语言(InterfaceDefinitionLanguage,IDL)中的数据类型列表中的数据类型。•读者在自己的系统建模中能够使用的其他类型。属性初始值设置:可以通过在属性名称和数据类型之后添加等于号(=)来为属性指定默认值,如下图所示。属性多重性:多重性为可选项,它表达该类的每个实例的属性值的个数。可以像应用于类之间的关系中那样把多重性应用于属性。例如,Student类具有属性Grades。不希望该属性只包含单个值,而是希望它包含该学生的所有成绩,可以是任意多个。派生的属性:另一种可以为属性提供的信息是派生值,它可以使用数学函数、字符串函数或者将要在应用程序中实现的其他商务逻辑。要想指出一个属性是派生的,需要在属性名之前添加一个前斜线(/),并且要附加一个注释,其中包含了派生属性值的指令,如下图所示。2.操作(方法)操作(Operation)表示类能够提供的功能服务。它在UML类矩形框中用文字串说明,如下图所示。操作名指示类可提供的功能服务,它后跟圆括号中的参数列表是可选项,即一个操作可以有参数,也可以没有参数。参数列表由逗号分隔的操作的形式参数组成,其格式为:参数名:类型=缺省值,…Student类返回列表是返回给调用者的单个变量值,它可以表示该操作程序运行的一个成功标志或者计算的值。7.1.2接口(Interface)表示接口的UML图使用一个长方形描述一个接口的主要构成,将长方形垂直地分为三层。◆顶部第1层是名字层,用interface修饰名字。◆第2层是常量层,列出接口中的常量及类型,格式是“常量名字:类型”。◆第3层是方法层,也称操作层,列出接口中的方法及返回类型,格式是“方法名字(参数列表):类型”。类的关系类之间可以建立四种关系:泛化、关联、依赖和实现。其标记如下图所示。泛化关系ClassAClassB如果一个类是另一个类的子类,那么UML通过使用一个实线连接两个类的UML图来表示二者之间的继承关系。如果A类中成员变量是用B类(接口)来声明的变量,那么A和B的关系是关联关系,称A关联于B。关联关系ClassAClassB依赖关系ClassAClassB依赖关系ClassAClassB泛化关系ClassAClassB依赖关系ClassAClassB依赖关系ClassAClassB依赖关系ClassAClassB实现关系如果A类中某个方法的参数用B类(接口)来声明的变量或某个方法返回的数据类型是B类型的,那么A和B的关系是依赖关系,称A依赖于B。如果一个类实现了一个接口,那么类和接口的关系是实现关系,称类实现接口7.1.7注释(Annotation)UML使用注释为类图提供附加的说明。UML在一个带卷角的长方形中显示给出的注释,并使用虚线将这个带卷角的长方形和所它所注释的实体连接起来。1)关联关系关联关系是指类之间的语义联系。关联可以具有如下特性:•关联名称•角色名称•多重性•导航性多个类可以关联到同一个类多重性:多重性(mutiplicity)用来指示一个类的多少对象与另一个类的一个对象相关。可以在类关系的任何一端添加多重性,来指示出多重性,如下图所示。多重性是一个数值或者数值范围,用来指示一个类的几个对象与另一个类的一个对象相关。如下图所示。关联的多重性角色类关系还可以通过添加角色来进一步丰富。在类图中使用角色可以帮助读者理解第一个类对于第二个类的作用。角色与多重性显示在相同的位置,在指示类之间关系线的上面或者下面,如下图所示。下图显示了player类和Team类在关联中分别扮演两个角色。关联的限定关联的限定类的关联还可以通过限定条件来明确类之间的关系。如下图所示。类的自反关联自反关联:类具有到自身的关联,称为自反关联。2聚集聚集也称为聚合,是关联的特例。聚集表示一类对象与另一类对象之间的关系,是整体与部分的关系。在陈述需求时使用的“包含”、“组成”、“分为……部分”等字句,往往意味着存在聚集关系。除了一般的聚集关系之外,还有两种特殊的聚集关系,分别称为共享聚集和复合聚集。图9.10共享聚集示例①共享聚集如果在聚集关系中处于部分方的对象可以同时参与多个处于整体方对象的构成,则该聚集称为共享聚集。①共享聚集②组合聚集如果部分类对象完全隶属于整体类对象,部分与整体共存,整体不存在了部分也会随之消失(或失去存在价值了),则该聚集称为组合聚集。②组合聚集练习:建模聚合关联和组合关联在这个练习中,将会使用目前为止学习到的所有类型的关系来创建一个类图,这些关系包括普通关联、泛化、聚合和组合。读者将会综合运用自己的知识从需求构造一个类图。下面是一个制造商和维修店使用的存货清单系统的需求列表,从这些信息构造一个类图:•存货由两个部分组成(零件和产品)。•产品由两个或者更多零件组成,系统可以拥有无限多个零件和产品。•存货中的部分零件包括调速轮、轮齿和加力燃烧室。•一名仓库保管员维护货存。一名装配工组装产品,一名维修员维修产品。•完成的产品包括1-3个标签:Manufacturer标签指示产品已经完成;Repair标签指示产品已经检修过;FCC标签指示产品中包含加力燃烧室。练习设计一组几何对象类图。组中父类为“几何单项”,由之衍生“线”、“圆”、“方”,“椭圆”、“多边形”、“点”等类。几何单项多边形圆矩形椭圆线点几何单项多边形圆矩形椭圆线点11..*{有序}7.2面向抽象原则7.2.1抽象类和接口抽象(abstract)类具有如下特点:◆抽象类中可以有abstract方法,也可以有非abstract方法。◆抽象类不能用new运算符创建对象。◆如果一个非抽象类是某个抽象类的子类,那么它必须重写父类的abstract方法。◆抽象类声明的对象做上转型对象。A.java,B.java,Application.javapublicabstractclassA{publicabstractintadd(intx,inty);}publicclassBextendsA{publicintadd(intx,inty){returnx+y;}}publicclassApplication{publicstaticvoidmain(Stringargs[]){Aa;a=newB();//a是B类对象的上转型对象intm=a.add(3,2);//a调用子类B重写的add()方法System.out.println(m);//输出结果为5}}接口(interface)具有如下特点:◆接口中只可以有public权限的abstract方法,不能有非abstract方法。◆接口由类去实现,即一个类如果实现一个接口,那么它必须重写接口中的abstract方法。◆接口回调。Com.java,ComImp.java,Application.javapublicinterfaceCom{publicabstractintsub(intx,inty);}classComImpimplementsCom{publicintsub(intx,inty){returnx-y;}}publicclassApplication{publicstaticvoidmain(Stringargs[]){Comcom;com=newComImp();//com变量存放ComImp类的对象的引用intm=com.sub(8,2);//com回调ComImp类实现的接口方法System.out.println(m);//输出结果为6}}7.2.2面向抽象所谓面向抽象编程,是指当设计一个类时,不让该类面向具体的类,而是面向抽象类或接口,即所设计类中的重要数据是抽象类或接口声明的变量,而不是具体类声明的变量。◆Circle.java,Pillar.javapublicclassCircle{doubler;Circle(doubler){this.r=r;}publicdoublegetArea(){return(3.14*r*r);}}publicclassPillar{Circlebottom;doubleheight;Pillar(Circlebottom,doubleheight){this.bottom=bottom;this.height=height;}publicdoublegetVolume(){returnbottom.getArea()*height;//bottom可以调用子类重写的getArea方法}}面向抽象重新设计Pillar类。首先编写一个抽象类Geometry(或接口),其中定义两个一个抽象的getAre()方法。publicabstractclassGeometry{//如果使用接口需用interface来定义Geometry。publicabstractdoublegetArea();}接着重新设计Pillar类以及Circle和Rectangle类。publicclassPillar{Geometrybottom;//bottom是抽象类Geometry声明的变量doubleheight;Pillar(Geometrybottom,doubleheight){this.bottom=bottom;this.height=height;}publicdoublegetVolume(){returnbottom.getArea()*height;//bottom可以调用子类重写的getArea方法}}publicclassCircleextendsGeometry{doubler;Circle(doub
本文标题:java课件chapter-7-面向对象的几个基本原则解析
链接地址:https://www.777doc.com/doc-3743269 .html