文章目录

  • 一.UML常见图
  • 1.类图(Class Diagram)
  • 2.对象图(Object Diagram)
  • 3.时序图(Sequence Diagram)
  • 二.UML类图线的概括
  • 1.类(Class)
  • 2.接口(interface)
  • 3.泛化(generalization)—继承关系
  • 4.实现(realization)—接口实现关系
  • 5.依赖(dependency)—使用关系
  • 6.关联(association)— 拥有关系
  • 7.组合和聚合概念简单理解
  • 8.聚合(aggregation)—组合类需要被组合类存在才能构建,被组合类可以单独存在
  • 9.组合(composition)— 组合类需要被组合类存在才能构建,被组合类不可以单独存在
  • 10.各类关系强弱
  • 三.生活案例之动物衍生关系图
  • 四.关联关系、聚合关系、组合关系之间的区别
  • 五.类关系记忆技巧


一.UML常见图

1.类图(Class Diagram)

类图是显示一组类、接口、协作以及它们之间关系的图。

Java中类的关联 java类关系图怎么看_uml


Java中类的关联 java类关系图怎么看_uml类图_02

2.对象图(Object Diagram)

对象图是表示在某一时间点上一组对象以及它们之间的关系的图。

Java中类的关联 java类关系图怎么看_类图_03

3.时序图(Sequence Diagram)

时序图显示对象之间的关系,强调对象之间消息的时间顺序,显示对象之间的交互。

Java中类的关联 java类关系图怎么看_Java中类的关联_04

二.UML类图线的概括

关系

线

继承

实现

依赖

关联

,注意:双向关联可以有两个箭头或者没有箭头,单向的关联有一个箭头

组合


聚合


1.类(Class)

使用3层矩形框表示

  • 第1层显示类的名称,如果是抽象类,则就用斜体显示。
  • 第2层是字段和属性
  • 第3层是类的方法。 注意前面的符号,+表示public-表示private#表示protected

Java中类的关联 java类关系图怎么看_uml_05

2.接口(interface)

使用2层矩形框表示,与类图的区别主要是顶端有<<interface>>显示

  • 第一层是接口名称
  • 第二层是接口方法

3.泛化(generalization)—继承关系

  • 继承类(extends) :用实线空心箭头来表示在Java中,用extends关键字来继承一个类
  • 继承关系中,子类会继承所具有的属性、方法,子类应该都有。子类还可以有自己独有的属性、方法。

在UML中 继承抽象类,无论类名还是抽象方法名,都以斜体的方式表示,因为这也是一种继承关系,所以子类与父类通实线空心箭头来联系。

  • 例如出租车、公交车、货车都是属于车,它们都有自己的名字,都可以上路跑。

java代码

class Car{
	//汽车名字
	private String name;
	public String getName(){this.name;};
	public String setName(String name){this.name= name;};
	//跑
	public String run(){this.name;};
}
 //公交车
class Bus extends Car{}

 //出租车
class Taxi extends Car{}

类图

Java中类的关联 java类关系图怎么看_java_06

注意:箭头方向是子类指向父类。

  • 泛化是依赖关系的特例

4.实现(realization)—接口实现关系

  • 实现接口(implements) :用虚线空心箭头来表示 在Java中,用implements关键字来实现一个接口。
  • 接口(包括抽象类)是方法的集合,实现接口的具体实现类需要实现接口下的所有方法。
  • 汽车和轮船都是交通工具,而交通工具只是一个可移动工具的抽象概念,船和车实现了具体移动的功能。

java代码:

//交通工具
interface Vehicle{
	//移动
    public void run();
}

 //汽车
class Car implements Vehicle{
	//汽车的名称(独有属性)
	private String name;
    @Override
    public void run() {
    }
}

//轮船
class Ship implements Vehicle{
	//轮船的名称(独有属性)
	private String name;
    @Override
    public void run() {
    }
}

类图

Java中类的关联 java类关系图怎么看_uml类图_07

实现是依赖关系的特例

5.依赖(dependency)—使用关系

  • 依赖(Dependency) :用虚线箭头来表示 是一种使用的关系,即一个类的实现需要另一个类的协助。在Java中,方法参数需要传入另一个类的对象,就表示依赖这个类
  • 大多数情况下,依赖关系体现在某个类的方法使用另一个类的对象作为参数

只要是在类中用到了对方,那么他们之间就存在依赖(Dependency)关系。如果没有对方,连编绎都通过不了的那种。比如

  • 类中用到了对方
  • 是类的成员属性
  • 是方法的返回类型
  • 是方法接收的参数类型
  • 方法中使用到
  • 例如:汽车依赖汽油,如果没有汽油,汽车将无法行驶。

java代码

//汽车
class Car{
    public void beforeRun(Oil oil){
        System.out.println("使用"+oil.getType+"号企业");
    }
}
 
//汽油
class Oil {
	//汽油类型
	private String type;
	private String getType(){this.type;};
	private String setType(String type){this.type = type;};
}

类图

Java中类的关联 java类关系图怎么看_uml类图_08

注意:类A需要用到类B,类A指向类B。

6.关联(association)— 拥有关系

  • 关联(Association) :用实线箭头来表示 在Java中,一个类的全局变量引用了另一个类,就表示关联了这个类
  • 关联关系是类与类之间最常用的一种关系,表示一类对象与另一类对象之间有联系。组合、聚合也属于关联关系只是关联关系的类间关系比其他两种要弱
  • 关联关系有4种:双向关联、单向关联、自关联、多重数关联。
  • 在多重性关系中,可以直接在关联直线上增加一个数字表示与之对应的另一个类的对象的个数。
  • 1…1:仅一个
  • 0…*:零个或多个
  • 1…*:一个或多个
  • 0…1:没有或只有一个
  • m…n:最少m、最多n 个(m<=n)依赖关系
  • 例如:汽车和司机,一辆汽车对应特定的司机,一个司机也可以开多辆车。(这按一个司机固定开司机专属的车来设计)

java代码
单向关联

//学生
class Student{
	private Pen pen;
}
//笔
class Pen{
}

双向关联

//司机
class Driver{
    private  Car[] cars;;
    public void  addCar(Car car){
        this.cars.add(car);
    }
}
//车 
class Car{ 
    private  Driver[] drivers;
    public void  addDriver(Driver driver){
        this.drivers.add(driver);
    }
}

类图

Java中类的关联 java类关系图怎么看_java_09

注意:类A中用到类B属性,类A指向类B。

  • 关联是依赖关系的特例

7.组合和聚合概念简单理解

  • 聚合:就是说各个对象聚合在一起工作,但是我没有你也行,我照样可以正常运行。
  • 组合呢,关系就比较密切,组合中的各个对象之间组成了一个整体,缺少了某一个对象就不能正常运行或者说功能会有很大缺陷。
  • 也就是说聚合对象 "不具备相同生命周期",而组合对象 "具有相同的生命周期"

举个例子:

  • 比如:电脑和U盘就是 “聚合”,而电脑显示器和主机就是 “组合”

8.聚合(aggregation)—组合类需要被组合类存在才能构建,被组合类可以单独存在

  • 聚合(Aggregation) :用尾部为空心菱形的实线箭头(也可以没箭头)来表示:是一种弱的‘拥有’关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分
  • 在聚合关系中,成员对象是整体的一部分,但是成员对象可以脱离整体对象独立存在。Java代码实现聚合关系,成员对象通常以构造方法、Setter方法的方式注入到整体对象之中
  • 例如:公交车司机和工衣、工帽是整体与部分的关系,但是可以分开,工衣、工帽可以穿在别的司机身上,公交司机也可以穿别的工衣、工帽。
//公交车司机
class BusDriver{
    private Clothes clothes;
    private  Hat hat;
    public void setClothes(Clothes clothes){this.clothes= clothes;}
    public void setHat(Hat hat){this.hat= hat;}
    public void show(){
            System.out.println("我穿了"+clothes.getName()+"的工衣,戴了"+hat.getName()+"的工帽");
	}
}
	
//工衣
class Clothes{
	//工衣类型
	private String name;
	public String getName(){this.name;};
	public String setName(String name){this.name= name;};
}
//工帽
class Hat{
	//工衣类型
	private String name;
	public  String getName(){this.name;};
	public String setName(String name){this.name= name;};;
}

类图

Java中类的关联 java类关系图怎么看_java_10

注意:类A中用到类B属性,类A指向类B。

  • 这六种类关系中,组合、聚合和关联的代码结构一样,可以从关系的强弱来理解。
  • 聚合属于关联的特例

9.组合(composition)— 组合类需要被组合类存在才能构建,被组合类不可以单独存在

  • 组合(Composition):用尾部为实心菱形的实线箭头(也可以没箭头)来表示。
  • 组合关系也表示的是一种整体和部分的关系,但是在组合关系中整体对象可以控制成员对象的生命周期,一旦整体对象不存在,成员对象也不存在,整体对象和成员对象之间具有同生共死的关系
  • Java代码实现组合关系,通常 在整体类的构造方法中直接实例化成员类,这是因为组合关系的整体和部分是共生关系,如果通过外部注入,那么即使整体不存在,那么部分还是存在的,这就相当于变成了一种聚合关系了。
  • 例如:人由头部和身体组成,两者不可分割,共同存在。通常是在构造函数的时候,通过new创建出来。

java代码

//人
class Human{
    private Head head;
    private  Body body;
    public void setHead(Head head){this.head = head;}
    public void setBody(Body body){this.body = body;}
}
//头
class Head{}
//身体
class Body {}

类图

Java中类的关联 java类关系图怎么看_uml_11

注意:类A中用到类B属性,类A指向类B。

  • 这六种类关系中,组合、聚合和关联的代码结构一样,可以从关系的强弱来理解。
  • 组合属于关联的特例

10.各类关系强弱

各类关系从强到弱依次是:继承→实现→组合→聚合→关联→依赖

Java中类的关联 java类关系图怎么看_uml类图_12

三.生活案例之动物衍生关系图

Java中类的关联 java类关系图怎么看_类图_13

四.关联关系、聚合关系、组合关系之间的区别

从上文可以看出,关联关系、聚合关系和组合关系三者之间比较相似,本文的最后就来总结一下这三者之间的区别。

关联和聚合的区别主要在于语义上

  • 关联的两个对象之间一般是平等的,聚合则一般是不平等的

聚合和组合的区别则在语义和实现上都有差别:

  • 组合的两个对象之间生命周期有很大的关联,被组合的对象在组合对象创建的同时或者创建之后创建,在组合对象销毁之前销毁,一般来说被组合对象不能脱离组合对象独立存在,而且也只能属于一个组合对象;
  • 聚合则不一样,被聚合的对象可以属于多个聚合对象。

再举例子来说:

  • 你和你的朋友属于关联关系,因为你和你的朋友之间的关系是平等的,关联关系只是表示一下两个对象之间的一种简单的联系而已,就像我有一个朋友
  • 你和你借的书属于聚合关系,第一是因为书可以独立存在,第二是因为书不仅仅属于你,也可以属于别人,只是暂时你拥有
  • 你和你的心脏属于组合关系,因为你的心脏只是属于你的,不能脱离与你而存在

五.类关系记忆技巧

继承实现,箭头方向:从子类指向父类。

  1. 定义子类是需要通过extends关键字指定父类;
  2. 子类一定是知道父类定义的,但父类并不知道子类的定义;
  3. 只有知道对方信息时才能指向对方;
  4. 所以箭头的方向是从子类指向父类。

继承实现:用线条连接两个类。

  1. 空心三角箭头表示继承或实现
  2. 实线表示继承,是is-a 的关系,表示扩展,不虚,很结实;
  3. 虚线表示实现,虚线代表“虚”无实体。

关联依赖:用线条连接两个类。

  1. 虚线表示依赖关系:
    临时用一下,若即若离,虚无缥缈,若有若无;表示一种使用关系,一个类需要借助另一类来实现功能;一般是一个类将另一个类作为参数使用,或作为返回值。
  2. 实线表示关联关系:
    关系稳定,实打实的关系,铁哥们;表示一个类对象和另一个类对象有关联;通常是一个类中有另一个类对象作为属性。

组合聚合:用菱形表示。

  1. 菱形就是像是一个盛东西的器皿(比如盘子);
  2. 聚合:空心菱形,代表空器皿里可以放很多相同的东西,聚集在一起(箭头方向所指的类);整体和局部的关系,两者有独立的生命周期,是has-a 的关系;弱关系,消极的词:弱-空。
  3. 组合:实心菱形,代表器皿里已经有实体结构的存在,生死与共;整体与局部的关系,和聚合关系对比,关系更加强烈;两者具有相同的生命周期,contains-a 的关系;强关系,积极的词:强-满。