java中类与类之间的关系

来源:互联网 发布:数据库四种隔离级别 编辑:程序博客网 时间:2024/05/16 02:30

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

1.在UML类图中的表示符号:

这里写图片描述

2.具体区别与联系

1>继承/泛化(Generalization)

  【泛化关系】:是一种继承关系,表示一般与特殊的关系,它指定了子类如何获得父类的所有特征和行为。在Java中此类关系通过关键字extends明确标识。
  
关系图如下:
这里写图片描述

2>实现(Realization)

  【实现关系】:是一种类与接口的关系,表示类是接口所有特征和行为的实现. 一个class类实现interface接口(可以是多个)的功能,在Java中此类关系通过关键字implements明确标识。

关系图如下:
这里写图片描述

3>依赖(Dependency)

  【依赖关系】:是一种使用的关系,即一个类的实现需要另一个类的协助,所以要尽量不使用双向的互相依赖. 一个类A使用到了另一个类B,而这种使用关系是具有偶然性的、临时性的、非常弱的,但是B类的变化会影响到A。在java中的代码表现为局部变量、方法的参数或者对静态方法的调用。
  
关系图如下:

这里写图片描述

4>关联(Association)

【关联关系】:是类与类之间的联接,它使一个类知道另一个类的属性和方法。两个类或者类与接口之间语义级别的一种强依赖关系,这种关系比依赖更强,一般是长期性的,而且双方的关系一般是平等的。

关系图如下:

这里写图片描述
5>聚合(Aggregation)
  【聚合关系】:关联关系的一种特例, 是强的关联关系. 聚合是整体与部分的关系,且部分可以离开整体而单独存在,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。

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

关系图如下:
这里写图片描述
6>组合(Composition)
  【组合关系】:也是关联关系的一种特例,是比聚合关系还要强的关系,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。
组合跟聚合几乎相同,唯一的区别就是”部分”不能脱离”整体”单独存在,就是说,”部分”的生命期不能比”整体”还要长。在java中的代码体现为成员变量/全局变量。

关系图如下:
这里写图片描述
以上几种关系的强弱顺序:
泛化=实现>组合>聚合>关联>依赖
关系图如下:
这里写图片描述

3、具体的代码实现

*依赖关系比较好区分,它是耦合度最弱的一种,在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;   }  

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

0 0
原创粉丝点击