在UML中表示Java继承和接口
面向对象中常见的几种类之间的关系
⾯向对象中常见的⼏种类之间的关系1.继承继承指的是⼀个类(称为⼦类)继承另外的⼀个类(称为⽗类)的功能,并可以在⼦类中增加⾃⼰的新属性和功能。
在Java中继承关系可以通过关键字 extends明确标识。
在UML类图表⽰中,⽤⼀条带空⼼三⾓箭头的实线表⽰继承关系,由⼦类指向⽗类。
2.实现关系实现指的是⼀个class类实现interface接⼝(可以是多个)的功能,实现是类与接⼝之间最常见的关系。
在Java中此类关系通过关键字implements明确标识。
在C++中,实现关系体现在抽象⽗类与具体⼦类之间的关系。
在UML类图中,⽤⼀条带空⼼三⾓箭头的虚线表⽰实现关系,从类指向实现的接⼝。
3.依赖关系依赖就是⼀个类A使⽤到了另⼀个类B来实现某些功能,⽽这种使⽤关系是具有偶然性的、临时性的、⾮常弱的,但是类B的变化会影响到类A。
在代码中,常表现为类B作为参数被类A在某个⽅法中使⽤。
在UML类图中,依赖关系⽤由类A指向类B的带箭头虚线表⽰。
4.关联关系关联体现的是两个类之间语义级别的⼀种强依赖关系,这种关系⽐依赖关系更强,⼀般是长期性的。
关联可以是单向、双向的。
在代码中常体现在,被关联类B以类的属性形式出现在关联类A中,也可能是关联类A引⽤了⼀个类型为被关联类B的全局变量。
在UML类图中,⽤由关联类A指向被关联类B的带箭头实线表⽰关联关系,在关联的两端可以标注关联双⽅的⾓⾊和多重性标记。
5.聚合关系聚合是关联关系的⼀种特例,它体现的是整体与部分的关系,即has-a的关系。
此时整体与部分之间是可分离的,它们可以具有各⾃的⽣命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。
⽐如飞机场和飞机。
在代码中的体现,和关联关系是⼀致的,只能从语义级别来区分。
在UML类图设计中,⽤空⼼菱形加实线箭头表⽰聚合关系。
6.组合关系组合也是关联关系的⼀种特例,体现的是⼀种contains-a的关系,这种关系⽐聚合更强,也称为强聚合。
Java继承,抽象类与接口的应用
创建子类——CommonDoor和SecurityDoor CommonDoor和 创建子类 CommonDoor
文件结构: 这三个类都放在同一个demo1包下:
普通门CommDoor : public class CommDoor extends Door { } 安全门: public class SecurityDoor extends Door { }
Java继承, Java继承,抽象类与接口的应用 继承
1.继承及继承实例 2.方法重写(Overwrite) 3.super关键字 4.方法重载(Overload) 5.final修饰符 6.abstract修饰符 7.抽象类 8.接口 9.接口和抽象类对比 10.接口和抽象类使用场合实例 11.总结
重写必须保证子类的方法定义完全和父类相同,不允许返回值类型不同的重写。 如: public String open(){……}
super关键字 super关键字
一般在以下情况我们会用到super关键字: 1.在子类构造方法中,通过super调用父类构造方法 2.在子类中访问父类被覆盖重写的方法和属性 现在给Door添加构造方法,如下: public Door(String doorName){ this.doorName=doorName; } 在SecurityDoor中可以如下定义: public SecurityDoor(String doorName,String brand){ super(doorName); this.brand=brand; } 说明,SecurityDoor有一个自己的brand属性。 这里的super代表调用父类的构现在我们使用抽象类来实现之前的功能。 public abstract class Door { public void open(){ System.out.println("门开了!"); } public void close(){ System.out.println("门关了"); } } 这样看似在结果上没有任何变化,但是却已经符合抽象思维某种角度和语 义——就相当于,水果是抽象类,那么苹果,梨就是具体类,由具体类负 责来实例对象,抽象类只负责描述抽象特征和行为。 注意:如果一个类继承了抽象类,但没有实现它所有的抽象方法,那么这 个类也是抽象类。
JAVA:UML类图符号表示方法学习
JAVA:UML类图符号表⽰⽅法学习
1.类(Class):使⽤三层矩形框表⽰。
第⼀层显⽰类的名称,如果是抽象类,则就⽤斜体显⽰。
第⼆层是字段和属性。
第三层是类的⽅法。
注意前⾯的符号,‘+’表⽰public,‘-’表⽰private,‘#’表⽰protected。
2.UML类图符号之接⼝:使⽤两层矩形框表⽰,与类图的区别主要是顶端有<<interface>>显⽰。
第⼀⾏是接⼝名称。
第⼆⾏是接⼝⽅法。
3.UML类图符号之继承类(extends):⽤空⼼三⾓形+实线来表⽰。
4.UML类图符号之实现接⼝(implements):⽤空⼼三⾓形+虚线来表⽰
5.UML类图符号之关联(Association):⽤实线箭头来表⽰,例如:燕⼦与⽓候
6.UML类图符号之聚合(Aggregation):⽤空⼼的菱形+实线箭头来表⽰
聚合:表⽰⼀种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的⼀部分,例如:公司和员⼯
组合(Composition):⽤实⼼的菱形+实线箭头来表⽰
组合:部分和整体的关系,并且⽣命周期是相同的。
例如:⼈与⼿
7.UML类图符号之依赖(Dependency):⽤虚线箭头来表⽰,例如:动物与氧⽓
8.UML类图符号之基数:连线两端的数字表明这⼀端的类可以有⼏个实例,⽐如:⼀个鸟应该有两只翅膀。
如果⼀个类可能有⽆数个实例,则就⽤‘n’来表⽰。
关联、聚合、组合是有基数的。
在uml中接口的表达方式
UML接口表达方式详解在UML(统一建模语言)中,接口是一种定义对象行为的抽象类型。
通过接口,可以明确地表达出对象的行为,以及对象之间的交互方式。
下面将从多个方面详细阐述在UML中接口的表达方式。
1.接口符号在UML中,接口通常用一个圆圈来表示,圈内是接口的名称。
此外,接口还可以包含一些附加的信息,如版本号、实现类等。
这些信息可以用括号或注释的形式放在接口符号的下方或旁边。
2.接口关系接口之间的关系主要指接口之间的依赖关系,包括导入、实现、依赖等。
这些关系在UML中通常用虚线箭头来表示,箭头的起点是依赖方,终点是提供方。
此外,接口之间还可以存在继承关系,这种关系在UML中用实线箭头和虚线矩形来表示。
3.接口职责与操作接口的职责是指接口所定义的方法和属性,这些方法和属性描述了接口所需要完成的行为。
在UML中,接口的职责通常用方法签名的形式来表示,而属性的表示方式则类似于类中的属性符号。
此外,还可以用注释的形式来详细说明接口的职责和操作。
4.接口与类之间的关系接口和类之间的关系包括实现和继承两种。
在UML中,实现关系用实线箭头和矩形来表示,箭头指向实现类;继承关系则用类似于类图中的继承符号来表示。
此外,如果一个类同时实现了多个接口,可以用加号(+)来表示。
5.接口继承与多重继承在UML中,接口之间的继承关系用类似于类图中的继承符号来表示。
这种继承关系称为多重继承,即一个接口可以继承多个父接口的属性和方法。
此外,一个类可以实现多个接口,从而实现多重继承。
这种继承方式可以提高代码的复用性和模块化程度。
6.抽象接口与具体实现抽象接口是一种只定义行为而不包含具体实现的接口。
在UML中,抽象接口通常用虚线矩形来表示,而具体实现则用实线箭头和矩形来表示。
这种表示方式可以清晰地展示出抽象层次和具体实现之间的关系。
7.包含和排除操作符在UML中,可以使用包含和排除操作符来描述接口之间的关系。
包含操作符用于表示一个接口继承另一个接口时必须实现其中的所有方法;排除操作符则用于表示一个接口继承另一个接口时可以忽略其中的某些方法。
利用UML类图设计Java应用程序详解
利用UML类图设计Java应用程序详解(一)来源:ZDNet China 作者:龚赤兵UML已成为面向对象设计的标准图形化工具,在UML定义的各种图中,本文只涉及类图。
Java应用程序由许多类所构成,类图的设计与实现,是 Java实现面向对象应用程序的核心。
本文通过一个具体的应用程序的设计与实现过程,详细说明了利用UML类图设计Java应用程序,使得开发过程标准化、可视化,代码编程简单化。
在类图中,类被描述为带有三层的盒子。
顶层为类名,一般用加粗字体表示。
如果类是抽象的,其名称用斜体表示;如果类是接口,则在类名上方标注<<interface>>。
中间层包含类的属性(或变量),底层包含类的方法。
与类名相似,如果方法是抽象的,那么它的名称也用斜体表示。
我们要设计的应用程序CDrawApp应用程序在基于字符的网格上画点、框和文本串,该应用程序涉及到Java面向对象的许多概念与应用方法,非常系统、全面,在您仔细研读后,定能迅速掌握UML类图,并将其应用到实际的Java应用程序开发过程中。
为减少代码长度,让程序简单易懂,这里使用Java 控制台窗口显示程序运行结果。
该程序总共由10个大类组成,以下分别介绍。
一、Point类在CDrawApp程序中定义的第一个类是Point类,该类用于通过x和y坐标在网格上标识一点。
其类图设计为:在该类中,有2个成员变量x和y,类图中,“-”表示变量或方法为private,“+”表示public,“#”则表示protected。
该类定义了三个不同的构造函数,这是重载(overload)的例子。
接着该类设计了7个访问方法。
getX()和getY()方法分别返回一点的x和y坐标。
SetX()和setY()方法根据参数xValue和 yValue的值设置这些坐标的值。
两个add()方法通过被访问点的坐标加上一个值来建立一个新的Point对象。
New 运算符建立类的新实例。
UML中继承实现依赖关联聚合组合的联系和区别_线条箭头
UML中几种类间关系:继承、实现、依赖、关联、聚合、组合的联系与区别继承指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性;实现指的是一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;依赖可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、、临时性的、非常弱的,但是B类的变化会影响到A;比如某人要过河,需要借用一条船,此时人与船之间的关系就是依赖;表现在代码层面,为类B作为参数被类A在某个method方法中使用;关联他体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我与我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的;表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;聚合聚合是关联关系的一种特例,他体现的是整体与部分、拥有的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;比如计算机与CPU、公司与员工的关系等;表现在代码层面,与关联关系是一致的,只能从语义级别来区分;组合组合也是关联关系的一种特例,他体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你与你的大脑;表现在代码层面,与关联关系是一致的,只能从语义级别来区分;对于继承、实现这两种关系没多少疑问,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系,是比较难区分的,有很多事物间的关系要想准备定位是很难的,前面也提到,这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖;UML-泛化、关联、聚合、组合、依赖一、泛化关系(generalization)1.说明表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。
JAVA继承、抽象类、接口
JA V A继承、抽象类、接口编辑人:星辰·樱联系QQ:838826112一.类的继承通过继承可以实现代码的复用,被继承的类称为父类或超类(superclass),由继承而得到的类称为子类(subclass)。
一个父类可以拥有多个子类,但一个类只能有一个直接父类,这是因为JA V A语言中不支多重继承。
子类继承父类的成员变量和成员方法,同时可以修改父类的成员变量或重写父类的方法,还可以添加新的成员变量或成员方法。
JA V A语言中有一个名为ng.Object的特殊类,所有的类都是直接或间接地继承该类而得到的。
1.子类的创建类的继承是通过extends关键字来实现的,在定义类时若使用ectends关键字指出新定义类的父类,就是在两个类之间建立了继承关系。
新定义的类称为子类,它可以从父类那里继承所有非private的成员作为自己的成员。
子类的创建:* 格式:class SubClass extends SuperClass* {* .* .* .* }2.调用父类中特定的构造方法在没有明确地指定构造方法时,子类还是会先调用父类中没有参数的构造方法,以便进行初始化的操作。
在子类的构造方法中可以通过super()来调用父类特定的构造方法。
例://以Person作为父类,创建学生子类Student,并在子类中调用父类里某指定的构造方法。
class Person2{private String name;private int age;public Person2()//定义Person2类的无参构造方法{System.out.println("调用了Person2类的无参构造方法");}public Person2(String name,int age)//定义Person2类的有参构造方法{System.out.println("调用了Person2类的有参构造方法");=name;this.age=age;}public void show(){System.out.println("姓名:"+name+" 年龄:"+age);}}class Student2extends Person2//定义继承自Person2类的子类Student2{private String department;public Student2()//定义Student2类的无参构造方法{System.out.println("调用了学生类的无参构造方法Student2()");}public Student2(String name,int age,String dep)//定义Student2类的有参构造方法{super(name,age);//调用父类的胡参构造方法department=dep;System.out.println("我是"+department+"学生");System.out.println("调用了学生类的有参构造方法Student2(String name,int age,String dep)");}}public class App8_2 {public static void main(String[] args){Student2 stu1=new Student2();//创建对象,并调用无参构造方法Student2 stu2=new Student2("李小四",23,"信息系");//创建对象并调用有参构造方法stu1.show();stu2.show();}}/*在子类中访问你类的构造方法,其格式为super(参数列表)。
java中的接口与继承,接口的例子讲解
java中的接⼝与继承,接⼝的例⼦讲解extends 继承类;implements 实现接⼝。
简单说:1.extends是继承⽗类,只要那个类不是声明为final或者那个类定义为abstract的就能继承,2.JAVA中不⽀持多重继承,但是可以⽤接⼝来实现,这样就要⽤到implements,3.继承只能继承⼀个类,但implements可以实现多个接⼝,⽤逗号分开就⾏了 ,⽐如 class A extends B implementsC,D,Eextends和implements有什么不同?对于class⽽⾔,extends⽤于(单)继承⼀个类(class),⽽implements⽤于实现⼀个接⼝(interface)。
interface的引⼊是为了部分地提供多继承的功能。
在interface中只需声明⽅法头,⽽将⽅法体留给实现的class来做。
这些实现的class的实例完全可以当作interface的实例来对待。
在interface之间也可以声明为extends(多继承)的关系。
注意:⼀个interface可以extends多个其他interface。
接⼝实例:例⼦1:⼀共包括4个类,分别是CAR.java,BigCar.java,TestCar.java,CarInterface.java。
CAR.java:声明⼀个接⼝,不实现⽅法,只声明⽅法,接⼝不能实例化。
package com.su.callback;publicinterface CAR {void start();void stop();}BigCar.java:⽤BigCar类实现接⼝CAR,实现它的⽅法,也就是写程序结构体。
BigCar是能够实例化的,BigCar的对象是Car型的。
当你需要调⽤接⼝CAR的⽅法的时候,需要⽤CAR的对象来调⽤CAR的⽅法,但是CAR⼜不能实例化,我们就可以⽤实现了CAR的BigCar的对象来调⽤CAR 的⽅法。
java集合继承关系
java集合继承关系
Java集合框架中的继承关系如下所示:
1. Collection接口是所有集合接口的根接口,它继承了Iterable
接口。
2. List接口和Set接口都继承自Collection接口。
3. Queue接口继承自Collection接口,它定义了队列的行为。
4. Deque接口继承自Queue接口,但它还定义了双端队列的操作。
5. Map接口是所有映射接口的根接口。
6. SortedSet接口和SortedMap接口都继承自Set接口和Map接口,分别定义了排序集合和排序映射的操作。
7. NavigableSet接口和NavigableMap接口都继承自SortedSet接
口和SortedMap接口,分别定义了带导航功能的排序集合和排序映射的操作。
8. AbstractCollection、AbstractSet、AbstractList、AbstractSequentialList、AbstractQueue和AbstractMap是实现集合和
映射的抽象类,它们提供了一些基本的实现。
9. ArrayList和LinkedList都实现了List接口,它们提供了不同
的列表实现方式。
10. HashSet、LinkedHashSet和TreeSet都实现了Set接口,它们
提供了不同的集合实现方式。
11. HashMap、LinkedHashMap和TreeMap都实现了Map接口,它们提供了不同的映射实现方式。
UML中各种图的画法(全)
UML中各种图的画法(全)UML中各种图的画法(全)一、UML中基本的图范畴:在 UML 2 中有二种基本的图范畴:结构图和行为图。
每个 UML 图都属于这二个图范畴。
结构图的目的是显示建模系统的静态结构。
它们包括类,组件和(或)对象图。
另一方面,行为图显示系统中的对象的动态行为,包括如对象的方法,协作和活动之类的内容。
行为图的实例是活动图,用例图和序列图。
二、UML中的类图:1.类图的表示:类的 UML 表示是一个长方形,垂直地分为三个区,如图 1 所示。
顶部区域显示类的名字。
中间的区域列出类的属性。
底部的区域列出类的操作。
在一个类图上画一个类元素时,你必须要有顶端的区域,下面的二个区域是可选择的(当图描述仅仅用于显示分类器间关系的高层细节时,下面的两个区域是不必要的)。
描述:顶部区域显示类的名字。
中间的区域列出类的属性。
底部的区域列出类的操作。
当在一个类图上画一个类元素时,你必须要有顶端的区域,下面的二个区域是可选择的(当图描述仅仅用于显示分类器间关系的高层细节时,下面的两个区域是不必要的)。
·类名:如果是抽象类,则采用斜体·类属性列表:name : attribute type 如 flightNumber : Integer,这是最常见的表达形式n ame : attribute type = default value 如balance : Dollars = 0,这是带有默认值的表达形式·类方法列表:name(parameter list) : type of value returned注意:在业务类图中,属性类型通常与单位相符,这对于图的可能读者是有意义的(例如,分钟,美元,等等)。
然而,用于生成代码的类图,要求类的属性类型必须限制在由程序语言提供的类型之中,或包含于在系统中实现的、模型的类型之中。
2.继承的表示:为了在一个类图上建模继承,从子类(要继承行为的类)拉出一条闭合的,单键头(或三角形)的实线指向超类。
UML的架构图中的实现和继承
多继承:一个子类可以有多 个父类
单继承:一个子类只能有一 个父类
抽象类继承:子类继承抽象 类中的方法和属性
特点:继承可以减少代码重 复,提高代码复用性
特点:继承可以方便地实现 代码修改和维护
继承与实现的区别和联系
继承:子类继承父类的属性和方法,实现代码重用
实现:接口实现类实现接口中的方法,实现功能扩展
多重继承:使用空心菱形表示,指向多 个父类
接口实现:使用空心三角形表示,指向接 口
接口继承:使用空心三角形表示,指向 多个接口
UML架构图中实现和继承的示例及解析
示例:使用UML 类图来表示实现和 继承关系
解析:实现关系表 示一个类实现了另 一个接口或抽象类
解析:继承关系表 示一个类继承了另 一个类的属性和方 法
实现的应用:实现在 UML架构图中广泛应 用,有助于理解系统 的结构和功能,以及 类或接口之间的关系。
实现的方式和特点
实现方式:通过继承、组合、聚合等方式实现 特点:实现方式灵活,可以适应不同的需求 继承:子类继承父类的属性和方法,实现代码重用 组合:多个类组合成一个整体,实现功能集成 聚合:多个类聚合成一个整体,实现功能扩展 实现方式:通过接口、抽象类等方式实现,实现代码重用和功能扩展
UML架构图中实现和继承的应 用实践
在软件设计中的应用实践
应用实践:在软 件设计中,实现 和继承是常用的 设计方法
应用实例:在 UML架构图中, 实现和继承可以 用于表示类之间 的关系
应用效果:实现 和继承可以提高 软件的可维护性 和可扩展性
应用技巧:在 UML架构图中, 实现和继承可以 通过箭头表示, 箭头指向实现或 继承的类
梳理java中继承与接口的关系,并举例说明用途。
一、引言在面向对象的编程语言中,继承和接口是两个重要的概念。
在Java中,继承和接口的关系是非常紧密的,它们对于构建灵活而强大的代码结构至关重要。
本文将对Java中继承与接口的关系进行梳理,并通过实际的例子来说明它们的用途。
二、继承与接口的概念1. 继承的概念继承是面向对象编程中的重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法。
子类可以继承父类的属性和方法,也可以重写父类的方法,从而实现代码的复用和扩展。
2. 接口的概念接口是一种抽象的数据类型,它定义了一个类所具有的方法,但不包括方法的具体实现。
类可以实现一个或多个接口,从而拥有接口中定义的方法。
接口可以帮助我们实现多重继承,提高代码的灵活性。
三、继承与接口的关系1. 继承与接口的相似之处继承和接口都可以实现代码的复用和扩展,它们都允许子类或实现类使用父类或接口的属性和方法。
2. 继承与接口的区别(1)继承是一种类与类之间的关系,它可以帮助我们构建类的层次结构,从而实现代码的复用。
而接口是一种约定,它定义了一组方法的规范,所有实现了该接口的类都必须实现这些方法。
(2)一个类只能继承一个父类,但是可以实现多个接口。
3. 继承与接口的关系在Java中,一个类既可以继承一个父类,又可以实现多个接口。
这种灵活的设计可以帮助我们构建更加强大和灵活的代码结构。
四、继承与接口的实际用途1. 继承的用途(1)代码复用:通过继承,子类可以直接使用父类的属性和方法,从而减少代码的重复编写。
(2)代码扩展:通过继承,子类可以重写父类的方法,从而实现对方法的灵活扩展。
例子:```class Animal {void sound(){System.out.println("动物发出叫声");}}class Dog extends Animal {void sound(){System.out.println("狗汪汪叫");}}```2. 接口的用途(1)实现多重继承:通过实现多个接口,一个类可以拥有多个接口中定义的方法。
用UML描述Java类
用UML描述Java类作者:仙人掌工作室本文选自:赛迪网本文从Java程序员的角度阐述UML和对象建模问题,是一个深入浅出的实用性介绍。
虽然从历史和基本理念方面来探讨UML非常吸引人,但我们还是直接从Java代码开始,看看UML如何描述Java类,再在叙述过程中插入一些历史和基本理念方面的知识。
UML类图在Java中,我们用下面的代码声明两个公用类,每一个Java类放入一个文件,文件的名字就是Java类的名字加上扩展名.java:UML是Unified Modeling Language的缩写,即“统一建模语言”。
与Java不同,UML是一种图形化的建模“语言”,它用一个矩形来表示一个类,在矩形的内部写上类的名称,一个类图可以放入多个类。
用矩形表示类,是UML中U(Unified)起的作用。
在UML的第一个版本出现,每一个对象建模专家都有自己的一套符号,一些人用点表示类,一些人用圆圈表示类,还有一些人用圆角矩形表示类。
显然,这很容易引起混乱。
后来,Rational 公司的三个专家——Grady Booch、James Raumbaugh、Ivar Jacobson达成了一致意见,同意“统一”他们各自使用的符号,UML终于创立,符号之争也终于落下了帷幕。
图一就是上面两个Java类的UML类图:图一:有二个类的简单类图如果要描述一系列类的内部结构以及它们相互之间的关系,UML类图是非常有用的。
例如,在许多书籍中,我们可以看到作者用类图来描述各个类之间的关系。
显然,空的类没有什么实际意义。
我们要为Person类加上一些实例变量和简单的方法。
下面是Person类的代码,已经过简化处理,不含任何注释:图二显示了Person类的UML图。
可以看到,UML用“+”和“-”符号分别表示public和private修饰符。
UML 只显示操作和属性类型之类的特征信息,操作的结果在行未的冒号之后声明。
图二:在UML类图中描述属性和方法由于UML类图不包含方法的具体实现,所以在UML类图中查看属性和方法等基本信息要比直接查看Java源代码更方便一些。
UML中的继承关系详解
UML中的继承关系详解继承是面向对象编程中的一个重要概念,它允许一个类继承另一个类的属性和方法。
在UML(统一建模语言)中,继承关系通过使用箭头来表示。
本文将详细介绍UML中的继承关系,包括其定义、特点以及在软件设计中的应用。
一、继承的定义和特点继承是面向对象编程中的一种机制,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。
通过继承,子类可以拥有父类的所有成员,包括字段、方法和属性。
这样可以减少代码的重复性,提高代码的可重用性和可维护性。
在UML中,继承关系用箭头表示,箭头从子类指向父类。
箭头的末端可以带有一个空心三角形,表示继承关系。
例如,如果类A继承自类B,则可以用箭头从A指向B,并在箭头末端加上一个空心三角形。
继承关系还可以分为单继承和多继承。
单继承表示一个子类只能继承一个父类,而多继承表示一个子类可以继承多个父类。
在UML中,单继承可以用一条箭头表示,多继承可以用多条箭头表示。
二、继承关系的应用继承关系在软件设计中有着广泛的应用。
它可以用于构建类的层次结构,提高代码的可重用性和可维护性。
下面将介绍继承关系在不同场景中的应用。
1. 继承关系在图形界面设计中的应用在图形界面设计中,继承关系可以用于创建不同类型的控件。
例如,可以定义一个基类Control,它包含了所有控件共有的属性和方法,如位置、大小、可见性等。
然后可以定义子类Button、TextBox、Label等,它们继承自Control类,并添加自己特有的属性和方法。
通过继承,可以减少代码的重复性,提高代码的可维护性。
2. 继承关系在游戏设计中的应用在游戏设计中,继承关系可以用于创建不同类型的角色和敌人。
例如,可以定义一个基类Character,它包含了所有角色共有的属性和方法,如生命值、攻击力、移动等。
然后可以定义子类Warrior、Mage、Archer等,它们继承自Character类,并添加自己特有的属性和方法。
Java利器之UML类图详解
Java利器之UML类图详解前⾔UML(Unified Modeling Language)中⽂统⼀建模语⾔,是⼀种开放的⽅法,⽤于说明、可视化、构建和编写⼀个正在开发的、⾯向对象的、软件密集系统的制品的开放⽅法。
UML展现了⼀系列最佳⼯程实践,这些最佳实践在对⼤规模,复杂系统进⾏建模⽅⾯,特别是在软件架构层次已经被验证有效。
【维基百科】最近看⼀些开源项⽬的时候,总是看到UML中的类图,⼀开始⾃⼰的做法就是跳过去类图的部分,不过后来⼜遇到了⼏次,就决定学习下,不能再选择逃避了,这也是⼀个即将优秀的程序探索者应该必备的素质。
今天把⾃⼰学习到的内容记录⼀下(怕健忘…),相信对类图不清楚的朋友,通过读取这篇⽂章后也能有⼀个⽐较清晰的认识,让你看的懂,画的出。
类图作⽤类图是软件⼯程的统⼀建模语⾔⼀种静态结构图,该图描述了系统的类集合,类的属性和类之间的关系。
帮助⼈们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试的重要模型依据。
学习好类图的绘制,是⼀位合格的软件⼯程师应有的技能。
类的UML图⽰在UML类图中,类使⽤包含类名,属性,⽅法名及其参数并且⽤分割线分隔的长⽅形表⽰。
例如最简单的⼀个类Person 类有两个属性分别是name和age,并提供对应的get和set⽅法。
java类代码如下/************************************************************************ Module: Person.java* Author: Code4Android* Purpose: Defines the Class Person***********************************************************************/import java.util.*;/** @pdOid 4615fa10-38a3-446e-a7d5-59dcb3e786b5 */public class Person {/** @pdOid f314a698-c3c1-4ec7-a8ea-f8b2df107a29 */private String name = zhangsan;/** @pdOid 271c633b-87e5-4b41-9f70-2ce320635014 */private int age = 23;/** @pdOid ccf5b7c1-d005-4a5f-b823-9988f2dd6f91 */public String getName() {// TODO: implementreturn name;}/** @pdOid 83e01fba-b004-498e-b7ab-778de8be6dfa */public int getAge() {// TODO: implementreturn age;}/** @param name* @pdOid 9525895a-11bf-44a3-afed-b4a014540a98 */public void setName(String name) {// TODO: implement=name;}/** @param age* @pdOid 16fd66cc-2af1-4fef-ae98-2a37f495a487 */public void setAge(int age) {// TODO: implementthis.age=age;}}那么⽤类图表⽰如下,它很简单的表⽰出了类的所有信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在UML中表示Java继承和接口
作者:仙人掌工作室本文选自:赛迪网
在上一篇文章中,我们引入了UML类图的概念,比较了在Java编程语言和UML类图中表示类、属性、操作和关联关系的不同之处。
下面我们来看看如何在UML中表示两个重要的Java概念——继承,接口。
继承
在Java中,我们可以声明一个类扩展(extends)另一个类,还可以声明一个类实现(implements)一个或者多个接口。
下面我们来看看如何在UML中表达这些概念。
下面是三个Java类的基本骨架。
第一个类是代表某种支付方式的Payment抽象类,另外两个类分别扩展Payment 类,描述两种不同的支付方式:
图一用UML显示了同样的三个类。
在操作和属性声明中,类型和参数之类的细节都没有显示出来,这是为了更
清楚地显示出类的整体结构以及各个类之间的关系。
图一:UML一般化关系
Java中的extends关键词声明了继承关系,相当于UML中的“一般化”(Generalization,也译为“泛化”)关系,在UML图形中用子类向超类的实线空心封闭箭头表示。
图一额外增加了一个Sale类,这是为了更清楚地说明UML一般化关系与UML定向关联关系所用箭头的不同。
关联关系与一般化关系的另一个不同之处在于,一般化关系的两端不需要说明多重性或角色名称。
显然,UML类图比三个Java源代码文件更清楚直观地显示出了三个类之间的继承关系。
如果你要与别人探讨设计思路,绘制UML草图也要比直接使用代码简单快捷得多。
也许有人会说,系统的类结构图就在他们的头脑中,他们只需要直接使用Java代码。
实际上,对于规模较大的系统,这种说法显然是不成立的;即使对于规模较小的系统,如果一定的时间之后要由其他程序员修改,没有UML图也会寸步难行——很难保证每一个人都了解你头脑中的类结构图。
在UML中,抽象类的标志是类的名字以斜体显示。
在白板或纸张上手工画UML草图时,很难区分字体是否是斜体。
为此,一些人建议这些场合可以在类名称的右下角加上{abstract}标记以示区别。
另一些人认为,在白板上写{abstrac t}显得太罗嗦,他们倾向于打破UML常规,在类名称的右下角加上一个0表示零个实例,如果在该位置写上1,则表示该类是一个singleton类(永远只有一个实例的类);如果在该位置写上N,则表示它是一个枚举类(拥有固定实例数量的类,如一星期中的天数,彩虹的颜色,等等)。
不过,这一切都不是标准的UML,只能用于手工绘制UML图的场合,看来也不可能得到UML建模工具的支持。
历史知识:UML首先由Rational公司的一个工作组发明,Ration公司是UML建模工具Rose的生产者。
UML于1995年的OOPSLA会议上被公诸于世,随后,OMG(对象管理组织)于1997年采用了UML规范。
不难理解,继
续负责发展UML规范的OMG任务组包含了来自几乎所有主流UML工具厂商的代表。
因此,除了严格遵从规范的UML软件工具,在一些书籍或网页上发现不规范的UML符号也不足为怪。
继承使得一个类能够使用另一个类的属性和方法,就象使用自己的属性和方法一样。
当这类继承机制第一次出现时,人们普遍把它视为重用现有代码的理想方法。
令人遗憾的是,规模过于庞大的继承树变得很脆弱,修改继承树的一部分,就会在整棵继承树中引起一系列的连带反映。
在面向对象的编程中,如果要实现有效的封装,就应该让改动局部化,即一个地方的改动不至于引起其他地方的变化。
而修改继承树一个地方引起其他地方的变化恰恰违背了上述设计思想。
UML图使得我们能够方便地掌握继承关系图,从而为应用继承关系带来了方便。
那么,什么时候适合运用继承关系呢?按照《Java Design》一书,对于超类A和子类B,执行如下检查:
命题“B是一个由A扮演的角色”不成立。
B永远不需要变形成为其他某些类别中的对象。
B扩展而不是覆盖或废弃A的行为。
A不仅仅是一个工具类(一些可以重用的实用功能)。
对于一个问题域(特定的业务对象环境):A和B定义了同一类型的对象,或者是用户事务、角色、实体(团体、位置或其他东西),或其他物体的相似类别。
如果上述任意一个判断不成立,那么把A和B定义成继承关系可能是不合适的,改用关联关系可能更加稳固、正确。
例如,图二违背上面的第一个判断,因为“雇员是一个由人扮演的角色”成立。
另外,它还违背了第二个判断,因为雇员确实可能改变其类别(身份),例如某个时候它可能是顾客。
这样,一个既是顾客又是雇员的人就要有两个独立的对象来描述,从而使保存在Person类里面的信息重复出现,带来了两个数据副本之间数据不一致的风险。
接口
Java编程语言中接口(Interface)的概念也能够与UML概念匹配。
UML中的接口是一种实现继承的形式,但这种继承形式与Java中通过关键词extends实现的继承有所不同。
在Java中,extends关键词描述了一种继承形式,它既继承接口也继承行为。
这种类型的继承有时被称为
Sub-classing。
与其他的面象对象编程语言不同,Java类只能从一个类继承。
许多时候,设计UML图的人熟悉多种编程语言,常常会引入多重继承的思想,例如C++的多重继承思想。
从已有的Java代码生成UML图(这个过程称为反向工程)不会带来多重继承的问题,但如果要求一个Java程序员去实现一个带有多重继承的UML
类图,就会出现问题。
如果多重继承中的超类是纯抽象类,这部分类可以用Java的接口来描述,但是,如果只做这种转换不足以把UML类图中的多重继承全部转换成单重继承,这时就必须修改UML类图重新建模了。
虽然Java不支持C++之类语言那样的多重继承,但它支持实现多重接口。
这种由Java关键词implements声明的继承只继承接口,这种继承有时被称作Sub-typing。
在UML中,实现接口的类与接口定义之间的关系叫做Realization关系,用一个虚线封闭箭头表示,从实现接口的类指向接口。
接口本身的UML图与普通类一样,
但它的名字上面要加上“<<interface>>”。
图四由图一修改而成,Payment类被一个接口取代。
(关于Realization名称的说明:Realization最常见的中文译名是“实现”。
但是,Java的implements也叫做“实现”。
为避免混淆,本文中凡是出现Realization的地方一律直接使用英文)。
接口可以从一个或者多个其他接口扩展。
UML一般化关系(实线封闭箭头)可用来描述这种关系,如图五所示。
UML还支持另一种接口符号,即用圆圈表示接口(加上连线之后就成了棒棒糖的样子),但这种表示法多用于UML组件图,在UML类图中比较少见。
如果UML图规模较大,有大量的类实现一个常用接口,整个UML图可能乱成一团糟。
《Java Design》一书提出了一种简化方法,后来又被《Streamlined Object Modeling》一书的作者采用,这就是在实现接口的类中,用接口的名字替代从接口继承的方法,不过这不属于标准方法。
遗憾的是,目前似乎还没有工具支持这种转换。
结束语:继承和接口是Java语言中非常有用的机制,我们已经看到,可以用UML的一般化和Realization关系使得Java的这两个概念可视化。
另外,一些非标准化的表示方法能够极大地简化UML图。
在下一篇文章中,我们将了解如何在Java程序中保留无法直接表达的UML语义信息。