Java类之间的关联关系(转载)

Java类之间的关联关系

UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又可以细化为聚合和组合。
一、泛化(Generalization)
泛化是父类和子类之间的关系,子类继承父类的所有结构和行为。在子类中可以增加新的结构和行为,也可以覆写父类的行为。

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

泛化对应Java中继承关系,即子类继承父类中出private修饰外的所有东西(变量、方法等)。示例代码:

public class Animal
{

}

public class Tiger extends
Animal {

}

Tiger继承Animal,因此Tiger与Animal之间是泛化(继承)关系。这个很好理解。

二、依赖(Dependency)

依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物,反之不成立。在你想显示一个事物使用另一个事物时使用。

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


通常情况下,依赖关系体现在某个类的方法使用另一个类作为参数。代码示例:

public class Screwdriver
{    //螺丝刀,作为人类的工具,是用来被人类使用的

}

public class
Person{

public void screw(Screwdriver src){   
//拧螺丝,需使用螺丝刀

}

}

Person类的screw()方法在使用时就得传入一个Screwdriver类型的参数,这样Screwdriver的改变就会影响到Person,因此Person与Screwdriver之间就是依赖关系(Person依赖于Screwdriver)。

三、关联(Association)

是一种结构关系,说明一个事物的对象与另一个事物的对象相联系。给定有关联的两个类,可以从
一个类的对象得到另一个类的对象。关联有两元关系和多元关系。两元关系是指一种一对一的关系,多元关系是一对多或多对一的关系。两个类之间的简单关联表示
了两个同等地位类之间的结构关系。当你想要表示结构化关系时使用关联。(可以想想Hibernate的关联关系)
一般用实线连接有关联的同一个类或不同的两个类。UML图如下:

通常情况下,关联关系是通过类的成员变量来实现的。代码示例:

public class Company { 
 //公司

private Employee emp
;  //一个公司雇员,公司与雇员之间就是一种关联关系。

}

public class
Employee{

}

雇员作为公司的属性,不同于上面的依赖。依赖的话,雇员的改变会影响公司,显然不是。在这里雇员仅仅作为公司的一个属性而存在。因此Employee与Company之间是关联关系。关联关系还可以细分为聚合和组合两种。

3.1  聚合(Aggregation)

聚合是一种特殊的关联。它描述了“has a”关系,表示整体对象拥有部分对象。

关 联关系和聚合关系来语法上是没办法区分的,从语义 上才能更好的区分两者的区别。聚合是较强的关联关系,强调的是整体与部分
之间的关系。例如,学校和学生的关系。聚合的整体和部分之间在生命周期上没有什么必然的联系,部分对象可以在整体对象创建之前创建,也可以在整体对象销毁
之后销毁。

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

与关联关系一样,聚合关系也是通过类的成员变量来实现的。示例代码:

public class Student{

}

public class School{

private List<Student>
students ;  //学校与学生是聚合关系

}

学校是整体,而学生是部分。学校与学生都是可以独立存在的,之间没有什么必然的联系。因此学校与学生就是聚合关系。

3.2  组合(Composition)

组合是聚合的一种形式,它具有更强的拥有关系,强调整体与部分的生命周期是一致的,整体负责部分的生命周期的管理。
生命周期一致指的是部分必须在组合创建的同时或者之后创建,在组合销毁之前或者同时销毁,部分的生命周期不会超出组合的生命周期。例如Windows的窗
口和窗口上的菜单就是组合关系。如果整体被销毁,部分也必须跟着一起被销毁,如果所有者被复制,部分也必须一起被复制。

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

与关联关系一样,组合关系也是通过类的成员变量 来实现的。示例代码:

public class Menu{

}

public class Window{

private List<Menu> menus
;

}

菜单的存在前提是窗口的存在,两者之间存在很强的拥有关系。且窗口对菜单的生命周期负责,只有在窗口创建之后,菜单才能够创建,菜单必须在窗口销毁之前销毁。因此Window与Menu之间是组合关系。

聚合和组合的区别在于:


合关系是“has-a”关系,组合关系是“contains-a”关系;聚合关系表示整体与部分的关系比较弱,而组合比较强;聚合关系中代表部分事物的对
象与代表聚合事物的对象的生存期无关,一旦删除了聚合对象不一定就删除了代表部分事物的对象。组合中一旦删除了组合对象,同时也就删除了代表部分事物的对
象。

另外有一个差别是组合中的一个对象在同一时刻只能属于一个组合对象,而聚合的一个部分对象可以被多个整体对象聚合,例如一个学生可以在多个学校就读,而一个菜单在同一时刻只能是某个窗口内的对象。

四、实现(Realization)

实现关系指定两个实体之间的一个合约。换言之,一个实体定义一个合约,而另一个实体保证履行该合约。对类来说,就是一个类实现了一个接口。

一般用一条指向接口的虚线表示,UML图如下:


实现对应Java中的实现接口(implements)。示例代码:
public
interface Person{
}
public class Student implements Person{
}
这个和泛化一样很好理解。
五、总结
类间关系有很多种,在大的类别上可以分为两种:纵向关系、横向关系。纵向关系就是继承关系,它的概念非常明确,也成为OO的三个重要特征之一,这里不过多的讨论。

横向关系较为微妙,按照UML的建议大体上可以分为四种:
依赖    (Dependency)
关联 
  (Association)
聚合   
(Aggregation)
组合   
(Composition)
关于关联,聚合,组合在实现上并没有显著区别,相区别他们只有通过判断关系双方之间的实际关系,如关系强弱、创建与销毁之间有无必要关联等。

它们的强弱关系是没有异议的:依赖 < 关联 < 聚合 <
组合<泛化(继承)

实现方式区别:
(1) 
  依赖关系:关系对象出现在局部变量或者方法的参数里,或者关系类的静态方法被调用
(2)    关联关系:关系对象出现在实例变量中
(3) 
  聚合关系:关系对象出现在实例变量中
(4) 
  合成关系:关系对象出现在实例变量中
(5) 
  Generalization: extends
(6)    实现: implements

原文出处:http://blog.csdn.net/hqshaozhu/article/details/7583545

Java类之间的关联关系(转载),布布扣,bubuko.com

时间: 2024-10-13 01:40:47

Java类之间的关联关系(转载)的相关文章

谈谈类之间的关联关系与依赖关系(转载)

(转载自:http://www.cnblogs.com/iyangyuan/archive/2013/06/16/3138463.html) 对于很多刚刚接触UML的童鞋,可能会对类之间的关联与依赖关系不太理解,今天小菜就浅薄的讲一下. 这块的确是有点乱,不过小菜突然找到了一个比较好的切入点,拿出来分享一下. 接触过设计模式的读者,会经常看到这样的场景:在实例化A类的时候,需要B类作为构造方法的参数,这说明A类需要持有一个B类的引用.比如代理模式.装饰模式等,都会这样做.例如Java中的IO流采

类与类之间的关系-----转载

类与类之间的几种关系 一.继承关系      继承指的是一个类(称为子类.子接口)继承另外的一个类(称为父类.父接口)的功能,并可以增加它自己的新功能的能力.在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性.在UML类图设计中,继承用一条带空心三角箭头的实线表示,从子类指向父类,或者子接口指向父接口. 二.实现关系      实现指的是一个class类实现interface接口(可以是多个)的功能,实现是类与接口之间最常见的关系.在Java中此类关系通过关键字impl

Java 类的热替换---转载

构建基于 Java 的在线升级系统 Java ClassLoader 技术剖析 在本文中,我们将不对 Java ClassLoader 的细节进行过于详细的讲解,而是关注于和构建在线升级系统相关的基础概念.关于 ClassLoader 的详细细节许多资料可以参考,有兴趣的读者可以自行研读. 要构建在线升级系统,一个重要的技术就是能够实现 Java 类的热替换 —— 也就是在不停止正在运行的系统的情况下进行类(对象)的升级替换.而 Java 的 ClassLoader 正是实现这项技术的基础. 在

iOS学习连载二之OC类和类之间的关联关系

类和类直接按存在多重关系,比如继承关系.关联关系:继承关系通俗的讲即什么是什么,关联关系即什么有什么:比如:继承关系:父亲和孩子之间的基因继承关系:关联关系:老师和学生之间的关联关系.下面讲一个例子,是汽车.引擎和车灯之间的关联关系. 首先,先写除了main类的其他类,包括.h文件和.m文件 lam.h代码: // //  Lamp.h //  oc2_Car_Engine_Lamp_test1 // //  Created by imac on 15/7/21. //  Copyright (

标明Java类之间关系的一些标志(其实,是箭头)

有几种基本的关系分别是:Association, Multiplicity, Aggregation, Composition, Inheritance / Generalization. Association太简单了,就不再重复了:Multiplicity就是字面上的意思(多样性),被联系的两者可以说一边的一个对应另一边的多个,or vice versa: Aggregation上次也回顾过其和Association的区别,不过现在发现Composition和Aggregation也很容易混

类之间的几种关系

Java类之间的关联关系 UML类图中的关系分为四种:泛化.依赖.关联.实现:关联关系又可以细化为聚合和组合. 一.泛化(Generalization) 泛化是父类和子类之间的关系,子类继承父类的所有结构和行为.在子类中可以增加新的结构和行为,也可以覆写父类的行为. 一般用一个带空心箭头的实线表示泛化关系,UML图如下: 泛化对应Java中继承关系,即子类继承父类中出private修饰外的所有东西(变量.方法等).示例代码: public class Animal { } public clas

Python设计模式 - 基础 - 类与类之间的六种关系

在程序中需要把世间万物抽象成相应的类,现实世界中物与物之间的关系和程序中类与类之间的关系相对应,因为世间万物是普遍联系的,所以程序中类与类之间也不是孤立的.在系统分析和框架设计中,根据面向对象机制的三大特性:封装.继承.多态,归纳和扩展出类与类之间六种不同的关系: - 依赖关系Dependency: 在局部变量,方法的形参,或者对静态方法的调用中实现 - 关联关系Association: 在类的成员变量中实现,可以双向也可以单向 - 聚合关系Aggregation: 强关联,整体与部分的关系,但

java中类之间的数据传递

虽然最开始学java的时候,就知道java类之间数据的传递,可能当时也懂,不过可能忘了, 刚好,用到了这个,然后只为将一个数据连续传到后两个类. 方法,通过构造函数,或者通过set方法. 构造函数: 代码不好演示, 1.类A,B,C,目的,将类A中的数据传到类C 2.现在B中创建一个类A的实例(用作句柄),然后在B的构造函数中将其"赋值"(不是初始化),构造函数中应该要有类A作为参数,尽量将赋值语句写到第一行. 3.当类B在类A中要使用时,自然要传一个参数才能构造,此时传递"

java 类与类之间的关系 及uml图

类与接口之间的关系 : 继承 类与类之间的关系 :继承关系  包含关系 类与对象之间的关系 : 实例 UML 类图中类与类之间的关系: 泛化关系(generalization) 关联关系(association) 聚合关系(aggregation) 合成关系 (compostion) 依赖关系 (dependency) 1.泛化(Generalization)[泛化]表示类与类之间的继承关系,接口与接口之间的继承关系,或类对接口的实现关系.一般化的关系是从子类指向父类的,与继承或实现的方法相反.