在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。
依赖(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的三个方法分别演示了依赖关系的三种不同形式。
- 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依赖、关联、聚合、组合之间的区别详解 在 Java 编程中,了解依赖、关联、聚合、组合之间的区别是非常重要的。这些概念都是 Java 面向对象编程的基础知识,正确理解它们可以帮助开发者设计出更加灵活、可维护的...
### UML中依赖、泛化、关联、聚合与组合的Java实现详解 #### UML基础知识概览 统一建模语言(UML)作为一种图形化的标准化建模语言,为软件开发提供了强大的可视化工具,帮助开发者理解、设计和记录软件系统。UML...
### UML学习之依赖、关联、聚合、组合与继承 #### 一、泛化(Generalization) **概念:** 泛化表示的是类与类之间的继承关系、接口与接口之间的继承关系,或者是类对接口的实现关系。在UML中,泛化关系通常用一个带...
UML 中继承、实现、依赖、关联、聚合、组合的联系与区别 UML 中的继承关系是指一个类继承另外一个类的功能,并可以增加它自己的新功能的能力,继承是类与类或者接口与接口之间最常见的关系。在 Java 中此类关系通过...
在UML中,有六种主要的类间关系:继承、实现、依赖、关联、聚合和组合。理解这些关系对于设计高质量的软件架构至关重要。 1. **继承**: 继承是类与类之间的一种层次结构关系,表示一个类(子类)可以从另一个类...
UML类图关系泛化、继承、实现、依赖、关联、聚合、组合 UML类图关系是Unified Modeling Language(统一建模语言)的核心概念之一,用于描述系统中的对象之间的关系。本文将对UML类图关系中的泛化、继承、实现、依赖...
根据 UML(统一建模语言),类之间的横向关系主要包括四种:依赖、关联、聚合和组合。这些关系反映了不同层次的强弱和生命周期绑定。 1. 依赖(Dependency): - UML 表示:虚线箭头 - 关系:“... uses a ...” ...
根据给定文件的信息,我们可以提炼出关于Java软件开发中类之间的关系的重要知识点,特别是针对第7章中的“类之间的关系”部分。这部分内容是面向对象编程(OOP)的基础之一,对于理解并构建复杂的软件系统至关重要。 ...
- 类之间的关系:关联、依赖、聚合、组合。 以上只是根据文件名推测的部分Java课程内容,实际的课件可能还包括数组、字符串、集合框架、IO流、多线程、异常处理、反射、注解、泛型等更深入的主题。通过这些课件,...
在Java编程语言中,类与类之间的关系是构建复杂系统结构的基础,这些关系不仅限于继承和封装,还包括了关联、依赖、聚合和组合等多种形式。以下是对这些关系的深入探讨: ### 1. 关联关系(Association) 关联关系...
JAVA类之间的关系思维导图,便捷整理思路,泛化、实现、依赖、关联、组合、聚合……
静态方法属于类,不依赖类的实例即可调用,而实例方法与类的特定对象关联,必须通过对象调用。静态方法无法访问实例成员,而实例方法可以。 在Java中,字符串连接通常使用`+`操作符或`String.concat()`方法,但频繁...
这些关系包括依赖、关联、聚合和组合等。 - **依赖**是最弱的一种关系,表示一个类A依赖于另一个类B的实现细节。 - **关联**比依赖更强一些,表示一个类A的对象包含另一个类B的对象作为成员变量,通常表示一种拥有...
3. **聚合(Aggregation)**:一种特殊的关联关系,表示整体和部分的关系。 4. **组合(Composition)**:一种更加强烈的聚合关系,表示整体对部分的完全拥有关系。 5. **依赖(Dependency)**:表示一个类依赖于另一个类...
类之间有三种基本关系:关联(包括聚合和组合)、泛化(对应继承)和依赖。 - 单向关联和双向关联描述类之间的访问关系。 - 聚合和组合是关联的特例,前者是弱关联,后者表示部分与整体的关系。 - 泛化用带空心...
- 熟悉UML的四大关系:关联、依赖、聚合和组合。 - 学习九种主要的UML图,如类图、序列图、状态图等,用于系统分析和设计。 8. **设计模式**: - 学习设计模式的基本原则和分类,如单一职责、开闭原则等。 - ...
设计模式之UML 类图以及类间关系(泛化 、实现、依赖、关联、聚合、组合) 类图用于描述系统中所包含的类以及它们之间的相互关系,帮助人们简化对系统的理解,它是系统分析和设计阶段的重要产物,也是系统编码和测试...
这些关系包括泛化、依赖、关联和聚合等。了解这些关系对于设计和实现软件系统非常重要。 一、泛化关系 泛化关系是类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系。这种关系是从子类指向...
Java 面试宝典1(1)涵盖了Java基础、Web技术和数据库相关的面试知识点,这些都是Java开发者必须掌握的核心技能。以下是对这些知识点的详细解析: 一、Java基础 1. Java基础知识:这部分涵盖Java语法、面向对象编程...
在Java编程中,聚集(Aggregation)和组合...总之,深入理解Java中的聚集和组合的区别与联系对于进行面向对象设计和分析至关重要,它们可以帮助开发者构建更加符合现实世界逻辑的类结构,提升软件的可读性和可扩展性。