Java实现UML中的五种关系
2015-09-26 15:18
543 查看
以前我们总是对于UML中的五种关系在代码中的实现总是搞不清楚,所以我在进行软考的时候在网上和课本上差了很多的资料,结合自己的理解进行了总结。
我们知道如果给五种关系排一个顺序的话耦合关系由弱到强依次是:依赖、关联、聚合、组合、继承。
一.依赖关系
我们说过依赖关系是耦合度最弱的一种关系,如果ClassA依赖ClassB那么就有了以下三种可能:
1.ClassB是全局的ClassA可以调用它。
2.ClassB是ClassA中的某个方法的变量。
3.ClassB作为ClassA中的某个方法的参数或者返回值。
二.关联关系
可以分为聚合类和组合类聚合就是ISA组合就是HASA,我们以前说过的大雁和雁群之间的关系,还有大雁和翅膀之间的关系分别是聚合和组合我们很多人在代码中对于这两者的区别不是很清晰,那么我们看下面的讲解吧!
聚合关系:
组合关系:
从代码中我们可以看出来在聚合关系中ClassB是独立于ClassA的而且从生命周期上看他们并不是同时产生同时消失的,也可以这样理解对于客户端来说他们就是两个独立的类,只不过ClassB是在ClassA中作为参数进行了调用,而对于组合关系来说我们可以看出,ClassB在ClassA中实例化出了一个对象,所以在生命周期来看他们是同时的,而对于客户端调用来说是就是只能调用ClassA。
三.泛化
泛化其实可以认识就是继承,但是子类继承父类并不是继承了父类的所有的方法和属性,而是继承了父类里面所有public和protect的方法,子类继承父类,父类泛化子类:
Animal a = new Cat();
这代表什么意思呢?
很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;
同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
四.实现关系
类实现接口的方法,这里就要比较一下抽象类和接口的关系了,我们知道借口是一种特殊的抽象类,那么他们之间有什么区别呢,我们知道抽象类中可以有抽象方法也可以有普通方法,而接口中必须是抽象方法,也可以说接口是极度抽象的抽象类!
我们知道如果给五种关系排一个顺序的话耦合关系由弱到强依次是:依赖、关联、聚合、组合、继承。
一.依赖关系
我们说过依赖关系是耦合度最弱的一种关系,如果ClassA依赖ClassB那么就有了以下三种可能:
1.ClassB是全局的ClassA可以调用它。
public class ClassA{ ClassB b=null; }
2.ClassB是ClassA中的某个方法的变量。
public class ClassA{ public void A(){ ClassB b=null; } }
3.ClassB作为ClassA中的某个方法的参数或者返回值。
public class ClassA{ public void A(ClassB b){ return null; } }
二.关联关系
可以分为聚合类和组合类聚合就是ISA组合就是HASA,我们以前说过的大雁和雁群之间的关系,还有大雁和翅膀之间的关系分别是聚合和组合我们很多人在代码中对于这两者的区别不是很清晰,那么我们看下面的讲解吧!
聚合关系:
public class ClassA{ public ClassB b; public ClassA(Class b){ this.b=b; } }
组合关系:
public class ClassA{ public ClassB b; public ClassA(){ b=new ClassB(); } }
从代码中我们可以看出来在聚合关系中ClassB是独立于ClassA的而且从生命周期上看他们并不是同时产生同时消失的,也可以这样理解对于客户端来说他们就是两个独立的类,只不过ClassB是在ClassA中作为参数进行了调用,而对于组合关系来说我们可以看出,ClassB在ClassA中实例化出了一个对象,所以在生命周期来看他们是同时的,而对于客户端调用来说是就是只能调用ClassA。
三.泛化
泛化其实可以认识就是继承,但是子类继承父类并不是继承了父类的所有的方法和属性,而是继承了父类里面所有public和protect的方法,子类继承父类,父类泛化子类:
Animal a = new Cat();
这代表什么意思呢?
很简单,它表示我定义了一个Animal类型的引用,指向新建的Cat类型的对象。由于Cat是继承自它的父类Animal,所以Animal类型的引用是可以指向Cat类型的对象的。那么这样做有什么意义呢?因为子类是对父类的一个改进和扩充,所以一般子类在功能上较父类更强大,属性较父类更独特,定义一个父类类型的引用指向一个子类的对象既可以使用子类强大的功能,又可以抽取父类的共性。
所以,父类类型的引用可以调用父类中定义的所有属性和方法,而对于子类中定义而父类中没有的方法,它是无可奈何的;
同时,父类中的一个方法只有在在父类中定义而在子类中没有重写的情况下,才可以被父类类型的引用调用;
对于父类中定义的方法,如果子类中重写了该方法,那么父类类型的引用将会调用子类中的这个方法,这就是动态连接。
四.实现关系
类实现接口的方法,这里就要比较一下抽象类和接口的关系了,我们知道借口是一种特殊的抽象类,那么他们之间有什么区别呢,我们知道抽象类中可以有抽象方法也可以有普通方法,而接口中必须是抽象方法,也可以说接口是极度抽象的抽象类!
相关文章推荐
- Eclipse 常用快捷键
- test8.1
- java反射机制的理解
- 【Java】面向对象的原则
- 【Java】Java线程的概念
- Genymotion下载及在eclipse上的配置
- 【笔记】Spring MVC学习指南(五)数据绑定和表单标签库
- myeclipse项目转maven项目
- Eclipse常用插件
- java多线程学习笔记
- 【Java】接口和抽象类的区别
- JAVA基础学习day16--集合三-Map、HashMap,TreeMap与常用API
- 黑马程序员---Java基础加强---JDK1.5新特性:注解
- Struts2标签—Iterator标签
- 【Java】interface
- java3:数据类型
- Java入门_反射
- struts2简介
- Java入门_异常
- 黑马程序员---Java基础加强---JDK1.5新特性:泛型