Java依赖-关联-聚合-组合之间区别_动力节点Java学院整理

发布时间 - 2026-01-11 02:43:42    点击率:

首先看一看书上对这四种关系的定义:

  • 依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
  • 关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。
  •  聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
  •  组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。

——摘自《Java面向对象编程》

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

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

class Car { 
  public static void run(){ 
    System.out.println("汽车在奔跑"); 
  } 
} 
class Driver { 
  //使用形参方式发生依赖关系 
  public void drive1(Car car){ 
    car.run(); 
  } 
  //使用局部变量发生依赖关系 
  public void drive2(){ 
    Car car = new Car(); 
    car.run(); 
  } 
  //使用静态变量发生依赖关系 
  public void drive3(){ 
    Car.run(); 
  } 
} 

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

class Driver { 
  //使用成员变量形式实现关联 
  Car mycar; 
  public void drive(){ 
    mycar.run(); 
  } 
  ... 
  //使用方法参数形式实现关联 
  public void drive(Car car){ 
    car.run(); 
  } 
} 

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

class Driver { 
  //使用成员变量形式实现聚合关系 
  Car mycar; 
  public void drive(){ 
    mycar.run(); 
  } 
} 

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

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

public Driver(Car car){ 
  mycar = car; 
}

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


# 依赖  # 关联  # 聚合  # 组合  # java利用Future实现多线程执行与结果聚合实例代码  # Java Fluent Mybatis 聚合查询与apply方法详解流程篇  # 合成聚合复用原则_动力节点Java学院整理  # Flink实现特定统计的归约聚合reduce操作  # 关联关系  # 是一种  # 则是  # 较强  # 来实现  # 现为  # 依赖于  # 自己的  # 这四  # 的是  # 都是  # 我就  # 给我  # 那就  # 让我们  # 将在  # 而在  # 它是  # 一辆  # 要想 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  宙斯浏览器怎么屏蔽图片浏览 节省手机流量使用设置方法  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  使用Dockerfile构建java web环境  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  Bootstrap整体框架之CSS12栅格系统  如何快速搭建高效香港服务器网站?  如何快速登录WAP自助建站平台?  Laravel怎么实现一对多关联查询_Laravel Eloquent模型关系定义与预加载【实战】  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Laravel如何实现API资源集合?(Resource Collection教程)  如何在万网利用已有域名快速建站?  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  在centOS 7安装mysql 5.7的详细教程  利用 Google AI 进行 YouTube 视频 SEO 描述优化  如何为不同团队 ID 动态生成多个非值班状态按钮  如何在橙子建站上传落地页?操作指南详解  Bootstrap CSS布局之列表  如何在宝塔面板创建新站点?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  VIVO手机上del键无效OnKeyListener不响应的原因及解决方法  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  JavaScript如何实现路由_前端路由原理是什么  原生JS获取元素集合的子元素宽度实例  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  Win11搜索栏无法输入_解决Win11开始菜单搜索没反应问题【技巧】  如何在不使用负向后查找的情况下匹配特定条件前的换行符  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  如何在阿里云部署织梦网站?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  如何基于云服务器快速搭建网站及云盘系统?  JavaScript如何操作视频_媒体API怎么控制播放  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)  如何在建站之星绑定自定义域名?  阿里云网站搭建费用解析:服务器价格与建站成本优化指南  Laravel怎么判断请求类型_Laravel Request isMethod用法  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  高防服务器租用如何选择配置与防御等级?