首页 > 编程语言 >java 组合>聚合>关联>依赖 的区别

java 组合>聚合>关联>依赖 的区别

时间:2023-07-04 17:45:37浏览次数:45  
标签:关系 依赖 聚合 组合 整体 关联 java

出处:https://zhuanlan.zhihu.com/p/359672087

简单来讲,组合是一种较为紧密的关系,从生命周期上看,部分和整体是共存亡的关系。
聚合则是一种较为松散的关系,部分和整体的生命周期未必一致。

在实际代码中:
组合关系中,部分的实例化在整体中进行。
聚合关系中,部分的实例化过程在整体外进行,然后通过某种方式注入给整体。

另一种表现可能是,组合是静态聚集,聚合是动态聚集。


 

在java中,类之间有各种关系,例如继承、实现、依赖、关联、聚合和组合。

尤其是关联、聚合和组合之间有点分不清他们之间的区别,今天通过这篇文章,带领大家彻底掌握他们之间的区别和联系。

1. 继承

继承是面向对象最显著的一个特性。继承是从已有的类(父类、父接口)中派生出新的类(子类、子接口),新的类能吸收已有类的数据属性和行为,并能扩展新的能力。在Java中此类关系通过关键字extends明确标识。

例如你可以先定义一个类叫动物(Animal), 然后再定义一个子类鸟(Bird), 子类鸟具有父类Animal的一切属性和行为,同时还可以扩展自己独特的属性和行为。

一般用一个带空心箭头的实线表示继承关系,用UML图表示如下:

 

 

2. 实现

实现是类和接口之间最常见的关系。指的是一个类实现接口的功能(一个类可以实现多个接口).在Java中此类关系通过关键字implements明确标识。

例如定义一个接口Fly(表示会飞),然后定义一个类Bird实现该接口。

一般用一个带空心箭头的虚线表示实现关系,用UML表示如下:

 

 

3、依赖

依赖关系是指一个类对另外一个类的依赖。这种关系是一种非常弱、临时性的关系。依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。

比如说Employee类中有一个方法叫做TakeMoney(Bank bank)这个方法,在这个方法的参数中用到了Bank这个类。那么这个时候可以说Employee类依赖了Bank这个类,如果Bank这个类发生了变化那么会对Employee这个类造成影响。

一般用一条指向被依赖事物的虚线表示依赖关系,用UML图表示依赖关系如下:

 

 

4、关联

关联关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的,它是依赖关系更强的一种关系。

在java语言中,关联关系一般表现为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量;

一般用实线连接有关联的两个类,用UML图表示如下:

 

 

5、聚合

聚合是一种特殊的关联关系,它是较强的一种关联关系,强调的是整体与部分之间的关系,从语法上是没办法区分的,只能从语义上区分。

例如雁群和大雁的关系、学校和学生之间的关系。

聚合的整体和部分之间在生命周期上没有什么必然的联系,部分对象可以在整体对象创建之前创建,也可以在整体对象销毁之后销毁。

一般用带一个空心菱形(整体的一端)的实线表示,用UML图表示如下:

 

 

6、组合

组合也是关联关系的一种特例,这种关系比聚合关系更强。它强调了整体与部分的生命周期是一致的,而聚合的整体和部分之间在生命周期上没有什么必然的联系。

在组合关系中,整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。

例如大雁和大雁的翅膀是组合关系。一般用带实心菱形(整体的一端)的实线来表示。UML图如下:

 

 

总结:

对于继承、实现这两种关系比较简单,他们体现的是一种类与类、或者类与接口间的纵向关系;其他的四者关系则体现的是类与类、或者类与接口间的引用、横向关系。总的来说,这几种关系所表现的强弱程度依次为:组合>聚合>关联>依赖

标签:关系,依赖,聚合,组合,整体,关联,java
From: https://www.cnblogs.com/bluestorm/p/17526373.html

相关文章

  • Java反射
    原文:https://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html Appleapple=newApple();//直接初始化,「正射」apple.setPrice(4);上面这样子进行类对象的初始化,我们可以理解为「正」。而反射则是一开始并不知道我要初始化的类对象是什么,自然也无法使用new......
  • java、vue基于hutool的aes指定秘钥加密(前后端aes加解密)
     后端代码//加密data对称AESKeybyte[]key=getBytes("._^BV67nW6ck8fwg",16);//秘钥长度最好是16位SymmetricCryptoaes=newSymmetricCrypto(SymmetricAlgorithm.AES,key);Stringjsondata=aes.encryptHex("中国test");System.out.println(jsondata);//......
  • Java获取CPU占用率、内存占用率
    @TestpublicvoidtestSystemUsage(){finallongGB=1024*1024*1024;while(true){OperatingSystemMXBeanoperatingSystemMXBean=ManagementFactory.getOperatingSystemMXBean();StringosJson=JSON.toJSO......
  • 七月四号Java学习
    今天在Java中学习到字面量和变量   ......
  • Java-基本语法回顾总结[25-36]
    常用的JVM启动参数有哪些?线程安全的理解?守护线程的理解?threadlocal的底层原理(25)常用的JVM启动参数有哪些?(26)线程安全的理解?(27)守护线程的理解?(28)threadlocal的底层原理(29)并发、并行与串行之间的区别?(30)Java死锁应如何避免?(31)......
  • java后台删除当前节点及其子节点-递归
    一、表设计 二、entityimportcom.fasterxml.jackson.annotation.JsonIgnore;importcom.joyoung.cloud.security.common.entity.BaseEntity;importio.swagger.annotations.ApiModel;importio.swagger.annotations.ApiModelProperty;importlombok.Data;importlombok......
  • Java数组
    Java数组数组概述1.数组概述1.相同类型变量的有序集合2.数组的声明和创建1.dataType[]arrayRefVar2.dataType[]arrayRefVar=newdataType[arraySize]内存分析1.声明数组int[]array=null;在栈中声明了array2.创建数组array=newint[10];在......
  • java+geotools (geotools for java)
    geotools所需的依赖,在pom.xml引入;<dependencies><!--forgeotoolsbegin--><!--处理空间数据--><!--geotools主要依赖--><dependency><groupId>org.geotools</groupId><artifa......
  • java工具类static静态方法读取yml配置
    当我们需要在工具类中获取yml配置的时候,由于变量是staic导致获取不到yml配置因为spring加载静态方法比IOC早,所以不能直接使用@Value注解读取yml配置,读取结果是null。@ComponentpublicclassTestUtil{//使用@Value注解读取yml配置的数据@Value("${test.url}")......
  • 【大厂面试必问】Java8 新特性
    博主介绍:✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家,WEB架构师,阿里云专家博主,华为云云享专家✌......