java_UML:继承/泛化、实现、依赖、关联、聚合、组合的联系与区别

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

结合了两篇文章,一篇有UML示例,一篇有代码示范,两篇文章链接如下:
UML:http://www.cnblogs.com/scevecn/p/5663369.html
示例:http://www.cnblogs.com/wanghuaijun/p/5421419.html
---------------------------------------------正文分割-----------------------------------------------

分别介绍这几种关系:

UML关系:继承(泛化)、实现、依赖、关联、聚合、组合的联系与区别

一、表示符号上的区别

二、具体区别与联系

1.继承/泛化(Generalization

  【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。继承是类与类或者接口与接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议性。

  【箭头指向】:带三角箭头的实线,箭头指向父类

  2.实现(Realization

  【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现.一个class类实现interface接口(可以是多个)的功能;实现是类与接口之间最常见的关系;在Java中此类关系通过关键字implements明确标识,在设计时一般没有争议性;

  【箭头指向】:带三角箭头的虚线,箭头指向接口

3.依赖(Dependency)

  【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖.一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A;比如某个老师要授课,则需要有这么一门课让他教授,此时老师与课之间的关系就是依赖;

  【代码表现】:局部变量、方法的参数或者对静态方法的调用

  【箭头及指向】:带箭头的虚线,指向被使用者

  4.关联(Association)

【关联关系】:是类与类之间的联接,它使一个类知道另一个类的属性和方法。两个类或者类与接口之间语义级别的一种强依赖关系,这种关系比依赖更强,一般是长期性的,而且双方的关系一般是平等的。比如:老师与学生,丈夫与妻子关联可以是双向的,也可以是单向的。双向的关联可以有两个箭头或者没有箭头,单向的关联有一个箭头。

  【代码体现】:成员变量/全局变量

  【箭头及指向】:带普通箭头的实心线,指向被拥有者

  上图中,老师与学生是双向关联,老师有多名学生,学生也可能有多名老师。但学生与某课程间的关系为单向关联,一名学生可能要上多门课程,课程是个抽象的东西他不拥有学生。

  下图为自身关联:

  5.聚合(Aggregation

  【聚合关系】:关联关系的一种特例,是强的关联关系.聚合是整体与部分的关系,且部分可以离开整体而单独存在,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享,比如计算机与CPU、公司与员工、车和轮胎的关系等;表现在代码层面,和关联关系是一致的,只能从语义级别来区分;

聚合关系也是使用实例变量实现的.java语法上是分不出关联和聚合的.关联关系中两个类是处于相同的层次,而聚合关系中两不类是处于不平等的层次,一个表示整体,一个表示部分.

  【代码体现】:成员变量/全局变量

  【箭头及指向】:带空心菱形的实心线,菱形指向整体

  6.组合(Composition)

  【组合关系】:也是关联关系的一种特例,是比聚合关系还要强的关系,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如:公司和部门是整体和部分的关系,没有公司就不存在部门合成关系不能共享。

组合跟聚合几乎相同,唯一的区别就是"部分"不能脱离"整体"单独存在,就是说,"部分"的生命期不能比"整体"还要长。

【代码体现】:成员变量/全局变量

【箭头及指向】:带实心菱形的实线,菱形指向整体

  各种关系的强弱顺序:    

  泛化=实现>组合>聚合>关联>依赖

  下面这张UML图,比较形象地展示了各种类图关系:

三、综合比较

1.聚合与组合

1)聚合与组合都是一种结合关系,只是额外具有整体-部分的意涵。

2)部件的生命周期不同

聚合关系中,整件不会拥有部件的生命周期,所以整件删除时,部件不会被删除。再者,多个整件可以共享同一个部件。

组合关系中,整件拥有部件的生命周期,所以整件删除时,部件一定会跟着删除。而且,多个整件不可以同时间共享同一个部件。

3)聚合关系是"has-a"关系,组合关系是"contains-a"关系。

2.关联和聚合

1)表现在代码层面,和关联关系是一致的,只能从语义级别来区分。

2)关联和聚合的区别主要在语义上,关联的两个对象之间一般是平等的,例如你是我的朋友,聚合则一般不是平等的。

3)关联是一种结构化的关系,指一种对象和另一种对象有联系。

4)关联和聚合是视问题域而定的,例如在关心汽车的领域里,轮胎是一定要组合在汽车类中的,因为它离开了汽车就没有意义了。但是在卖轮胎的店铺业务里,就算轮胎离开了汽车,它也是有意义的,这就可以用聚合了。

3.关联和依赖

1)关联关系中,体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如我和我的朋友;这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。

2)依赖关系中,可以简单的理解,就是一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A

4.综合比较

这几种关系都是语义级别的,所以从代码层面并不能完全区分各种关系;但总的来说,后几种关系所表现的强弱程度依次为:

组合>聚合>关联>依赖

 

结合了两篇博客如下:

http://blog.sina.com.cn/s/blog_94c2c46a0102vaiz.html

http://blog.csdn.net/wzjking0929/article/details/51803110



第二篇:

java--依赖、关联、聚合和组合之间区别的理解

在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。 


依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。 

关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。 

聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。 

组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。 



以上关系的耦合度依次增强(关于耦合度的概念将在以后具体讨论,这里可以暂时理解为当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强)。由定义我们已经知道,依赖关系实际上是一种比较弱的关联,聚合是一种比较强的关联,而组合则是一种更强的关联,所以笼统的来区分的话,实际上这四种关系、都是关联关系。 

依赖关系比较好区分,它是耦合度最弱的一种,在java中表现为局域变量、方法的形参,或者对静态方法的调用,如下面的例子:Driver类依赖于Car类,Driver的三个方法分别演示了依赖关系的三种不同形式。 

Java代码  
  1. class Car {   
  2.     public static void run(){   
  3.         System.out.println("汽车在奔跑");   
  4.     }   
  5. }   
  6.      
  7. class Driver {   
  8.     //使用形参方式发生依赖关系   
  9.     public void drive1(Car car){   
  10.         car.run();   
  11.     }   
  12.     //使用局部变量发生依赖关系   
  13.     public void drive2(){   
  14.         Car car = new Car();   
  15.         car.run();   
  16.     }   
  17.     //使用静态变量发生依赖关系   
  18.     public void drive3(){   
  19.         Car.run();   
  20.     }   
  21. }  




关联关系在java中一般使用成员变量来实现,有时也用方法形参的形式实现。依然使用Driver和Car的例子,使用方法参数形式可以表示依赖关系,也可以表示关联关系,毕竟我们无法在程序中太准确的表达语义。在本例中,使用成员变量表达这个意思:车是我自己的车,我“拥有”这个车。使用方法参数表达:车不是我的,我只是个司机,别人给我什么车我就开什么车,我使用这个车。 


Java代码  
  1. class Driver {   
  2.     //使用成员变量形式实现关联   
  3.     Car mycar;   
  4.     public void drive(){   
  5.         mycar.run();   
  6.     }   
  7.     ...   
  8.     //使用方法参数形式实现关联   
  9.     public void drive(Car car){   
  10.         car.run();   
  11.     }   
  12. }  



聚合关系是是一种比较强的关联关系,java中一般使用成员变量形式实现。对象之间存在着整体与部分的关系。例如上例中 

Java代码  
  1. class Driver {   
  2.     //使用成员变量形式实现聚合关系   
  3.     Car mycar;   
  4.     public void drive(){   
  5.         mycar.run();   
  6.     }   
  7. }  




假如给上面代码赋予如下语义:车是一辆私家车,是司机财产的一部分。则相同的代码即表示聚合关系了。聚合关系一般使用setter方法给成员变量赋值。 

假如赋予如下语义:车是司机的必须有的财产,要想成为一个司机必须要先有辆车,车要是没了,司机也不想活了。而且司机要是不干司机了,这个车就砸了,别人谁也别想用。那就表示组合关系了。一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,例如上例中,加上一个以Car为参数的构造方法 

Java代码  
  1. public Driver(Car car){   
  2.     mycar = car;   
  3. }  



所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。

分类: java 开发
标签: java
5
0
«上一篇: 安卓--使用Intent实现Activity之间传值与跳转
»下一篇: Java开发--操作MongoDB
posted @ 2016-04-22 15:18 专注it 阅读( 11957) 评论( 0) 编辑 收藏
UML图中类之间的关系:依赖,关联,聚合,组合,泛化,实现 类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。 3) 类的属性即类的数据职责,类的操作即类的行...... 阅读详情

相关推荐

UML】--泛化继承

UML】--泛化继承 一、泛化(generalization ) 1.定义:   表示类类之间的继承关系,接口接口之间的继承关系,或类对接口的实现关系。 一般化的关系是从子类指向父类的,继承实现的方法相反。   泛化(generalization)是指类(父类,superclass)其一个或多个变体(子 类,subclass)之间的关系。泛化利用类的相

何新生(Daniel) 勇敢坚毅真正之才智乃刚毅之志向。 —— 拿破仑 1万+

UML用例图中泛化继承等的区别

UML用例图中包含(include)、扩展(extend)和泛化区别   (2010-04-12 21:40:23) 转载▼ 标签:  uml   include   extend   泛化   扩展   包含   杂谈   a include b 表示 b是a中执行不可缺少的

忆凌波的专栏 8260

UML关系-继承泛化

在设计模式里只提到了继承关系,其实继承关系泛化关系的图上标示是一样的,很好奇为什么不说是泛化关系,所以在这里就写一些泛化继承的对比。 一、百科里是这样解释的: 泛化关系是类元的一般描述和具体描述之间的关系,具体描述建立在一般描述的基础之上,并对其进行了扩展。具体描述一般描述完全一致所有特性、成员和关系,并且包含补充的信息 泛化是可传递的,可以跨越任意层次。术语祖先(ancestor)和

刘佳欢 5243

UML类图关系(泛化继承实现依赖关联聚合组合

UML类图中,常见的有以下几种关系: 泛化(Generalization), 实现(Realization),关联(Association),聚合(Aggregation),组合(Composition),依赖(Dependency)1. 泛化(Generalization)  【泛化关系】:是一种继承关系,表示一般特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,

光阴迷客的知识库 4764

(转)java_UML继承/泛化实现依赖关联聚合组合的联系区别 (2016-07-12)

分别介绍这几种关系: UML关系:继承泛化)、实现依赖关联聚合组合的联系区别 一、表示符号上的区别 二、具体区别联系 1.继承/泛化(Generalization)   【泛化关系】:是一种继承关系,表示一般特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。继承是类类或者接口接口之间最常见的关系;在Jav...

三月的船长 250

java_UML继承/泛化实现依赖关联聚合组合的联系区别 (2016-07-12)...

分别介绍这几种关系: UML关系:继承泛化)、实现依赖关联聚合组合的联系区别 一、表示符号上的区别 二、具体区别联系 1. 继承/泛化(Generalization)   【泛化关系】:是一种继承关系,表示一般特殊的关系,它指定了子类如何特化父类的所有特征和行为。例如:老虎是动物的一种,即有老虎的特性也有动物的共性。继承是类类或者接口接口之间最常见的关系;在Ja...

weixin_30701575的博客 1062

关联依赖组合聚合泛化区别UML详细解析

类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系的对象集合的总称。 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务。一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法)。 3) 类的属性即类的数据职责,类的操作即类的行为职责     ...

weixin_46246170的博客 1万+

UML关系:继承泛化)、实现依赖关联聚合组合的联系区别

转自:http://www.cnblogs.com/scevecn/p/5663369.html 分别介绍这几种关系: UML关系:继承泛化)、实现依赖关联聚合组合的联系区别 一、表示符号上的区别 二、具体区别联系 1. 继承/泛化(Generalization)   【泛化关系】:是一种继承关系,表示一般特殊的关系,它指定了子类

nameisbill的博客 1万+

UML类图之类间关系(关联聚合组合泛化依赖实现)

目录类图定义类图中的事物类图中的关系关联关系双向关联单向关联关联多重性关联聚合关系(has-a)组合关系泛化关系依赖关系实现关系关联聚合组合之间的区别关联关系和依赖关系的区别 类图定义 类图以反映系统类的结构(属性、操作)以及类之间的关系为主要目的,描述了软件系统的结构,是一种静态建模方法 类图中的“类”面向对象语言中的“类”的概念是对应的,是对现实世界中的事物的抽象。 类图中的事物 1. 类 从上到下分为三部分,分别是类名、属性和操作。类名是必须有的 2. 抽象类 不能直接被实例化的类,是

weixin_43514899的博客 1万+

Java 类之间的关系:泛化依赖关联实现聚合组合

文章目录泛化依赖关联(Association)聚合关系(Aggregation)组合关系(Composition)实现关系(Implementation)总结参考资料 首先类之间的关系从宏观上可以分为:继承泛化)、依赖关联,而其中关联又有两种特例:聚合组合,不过在 UML2.X 中聚合组合视为成一种关系了。 泛化泛化关系(Generalization)也就是继承关系,用于描述父类...

My Blogs 4619

UML类图 - 依赖 泛化 实现 关联 聚合 组合

UML——Unified modeling language UML(统一建模语言),是一种用于软件系统分析和设计的语言工具,它用于帮助软件开发人员进行思考和记录思路的结果UML本身是一套符号的规定,就像数学符号和化学符号一样,这些符号用于描述软件模型中的各个元素和他们之间的关系,比如类图中有类、接口、实现泛化依赖组合聚合等使用UML来建模,常用的工具有 Rational Rose , 也可以使用一些插件来建模在UML系统开发中有三个主要的模型:从用户的角度展示系统的功能,包括用例图。采用对象、属性

weixin_46075832的博客 1567

UML中常见关系详解(泛化实现依赖关联组合聚合

UML中类类,已经类接口,接口接口的关系有:泛化(generalization),关联(association),依赖(dependency),实现(realization)这几种。 以下关系由弱到强排列。 1.泛化/一般化 关系 (generalization) 是指一个类(子类、子接口)继承另外一个类(称为父类、父接口)的功能,并可以增加它自己新功能的能力。继承是类类或者接口接口...

zhuyongru的专栏 2570

泛化,实现,依赖,关联(聚合,组合)

UML 中类类, 类接口, 接口接口这间的关系有: 泛化(generalization) 关系, 关联(association)关系( 关联, 聚合, 合成), 依赖(dependency)关系,实现(realization)关系. 泛化(generalization) 关系是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接口)的功能,并可以增加它自己的新功能的能力,继承是类类或者接口接口之间最常见的关系;在Java中此类关系通过关键字extends明确标识,在设计时一般没有争议.

骐骥一跃,不能十步;驽马十驾,功在不舍。 1974
上一篇: 设计一个有getMin功能的栈 程序员代码面试指南
下一篇: Java核心技术(卷1) 10th 总结(兼与Java编程思想等对比)
wjp_seu
博客等级 码龄14年 38粉丝 41原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值