面向对象中类和类的关系
来源:互联网 发布:关于mac版千牛问题. 编辑:程序博客网 时间:2024/05/22 15:29
在面向对象方法中,我们在确定了类及类的属性和方法后,不可避免的要研究类和类之间的关系,正是这些关系将整个事情串联起来,使彼此之间有了联系,就像现实生活中,人与人交往中存在着不同的关系。了解这些关系,对于我们开发系统百利而无一害,可以让我们轻松、高效的工作,同样像我们在日常生活中处理好人与人之间的关系,会给我们带来巨大的好处。那么我们就来认识一下,面向对象中类与类之间有那些关系。
类和类之间的关系大概可以分为一下几种类型:泛化关系(Generalization)、实现关系(realization)、依赖关系(Dependency)、关联关系(Association)(关联、聚合(Aggregation)、组合(Composition))。泛化关系和实现关系体现的是一种类和类、或者类和接口间的关系,不存在引用,归结为纵向关系;依赖关系和关联关系体现的是类和类、类与接口间的引用,归结为横向关系。
一、泛化关系
泛化关系是一个类(子类、子接口)继承另外的一个类(父类、父接口)的功能,并且可以有自己的新功能,也既是我们所说的继承关系。在java中通过extends来标识。在UML中用一条带空心箭头的实现表示,从子类指向父类,或者子接口指向父接口。
代码如下: Class _A{} Class _B extends _A{} Public class Test{ Public static void main(String args[]){ _A a = new _B(); } }
二、实现关系
实现关系指的是class类实现interface接口(可以使多个接口)。在java中用implements标识,在UML中用一条带空心三角箭头的虚线标识,从类指向实现的接口。
代码如下:Interface A{}Class B implements A{}Public class Test{ Public static void main( String args[] ){ B b = new B(); } }
说明:以上泛化和实现为一对,两者都用空心三角形,继承关系比实现接口关系耦合性强, 所以继承用实线,实现接口用虚线
三、依赖关系
依赖关系是类与类之间的连接. 表示一个类依赖于另一个类的定义. 依赖关系总是单向的 。依赖是类的五种关系中耦合最小的一种关系。因为依赖关系在生成代码的时候,这两个关系类都不会增加属性。这种微弱的关系可以用类之间的相互了解的程度来说明。在java 中. 依赖关系体现为: 局部变量, 方法中的参数, 和对静态方法的调用.。在UML中,依赖关系用由类A指向类B的带箭头虚线表示。
代码如下所示:
Class A{ }Class B{ }
依赖关系表现形式一:
A类是B类的某个方法中的变量,则B类可以调用它,代码如下:
Class B{ Public void info(){ Private A a; }}
注:B有一个info方法,A类作为该方法的变量来使用。A类的生命期,它是当B类的info方法被调用的时候,才被实例化。
依赖关系表现形式二:
A类是作为B类中某个方法的参数或者返回值时,代码如下:
Class B { Public A info( A a){ Return null; }}
依赖关系表现形式三:
A类中有一个是静态方法,B类可以调用它
无用多说,A类被B类的一个方法持有。生命期随着方法的执行结束而结束。
四、关联关系
关联体现的是两个类之间语义级别的一种强依赖关系,这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,它使一个类知道另一个类的属性和方法,而且双方的关系一般是平等的。关联可以是单向、双向的。在java 语言中关联关系是使用实例变量实现的。在UML中,关联关系用由关联类A指向被关联类B的带箭头实线表示,在关联的两端可以标注关联双方的角色和多重性标记。
单向关联如下:
Class A { }Class B { Public A a; }
双向关联如下:
Class A { Public B b; }Class B { Public A a; }
说明:依赖和关联的区别:
①从类的属性是否增加的角度看:
发生依赖关系的两个类都不会增加属性。其中的一个类作为另一个类的方法的参数或者返回值,或者是某个方法的变量而已。
发生关联关系的两个类,其中的一个类成为另一个类的属性,而属性是一种更为紧密的耦合,更为长久的持有关系。
②从关系的生命期角度看:
依赖关系是仅当类的方法被调用时而产生,伴随着方法的结束而结束了。
关联关系是当类实例化的时候即产生,当类销毁的时候,关系结束。相比依赖讲,关联关系的生存期更长。
因为,关联关系比依赖关系耦合性强,所以,关联关系用实线,依赖关系用虚线。
关联关系经过细化,还存在两种特例:聚合和组合。
(1)聚合关系:是整体和个体之间的关系,即has-a的关系,此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享;表现在代码层面,和关联关系是一致的,只能从语义级别来区分。从java 语法上是分不出关联和聚合的。在UML中,聚合关系以空心菱形加实线箭头表示。
代码如下:
Class B { }Class A{ Public B b; A (B b){ This.b = b; }}
注意:关联关系中两个类是处于相同的层次, 而聚合关系中两不类是处于不平等的层次, 一个表示整体, 一个表示部分。
(2)组合关系: 体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合;他同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束;比如你和你的大脑;合成关系不能共享. 。表现在代码层面,和关联关系是一致的,只能从语义级别来区分。在UML中,组合关系以实心菱形加实线箭头表示。
代码如下:
Class B { }Class A{ Public B b; A (){ b = new Wings(); }}
注意:这两种关系的区别在于
①构造函数不同
聚合类的构造函数中包含了另一个类作为参数。A的构造函数中要用到B作为参数传递进来。A可以脱离雁群类而独立存在。
组合类的构造函数中包含了另一个类的实例化。表明A在实例化之前,一定要先实例化B,这两个类紧密的耦合在一起,同生共灭。B类是不可以脱离A类而独立存在
②信息的封装性不同
在聚合关系中,客户端可以同时了解A类和B类,因为他们都是独立的
而在组合关系中,客户端只认识A类,根本就不知道B类的存在,因为B类被严密的封装在A中。
③生命周期不同:
聚合是整体与部分之间是可分离的,他们可以具有各自的生命周期,不会因为一方的消失另一方跟着消失。
聚合是整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。
- 面向对象中类和类的关系
- 面向对象UML中类的关系
- Java的 面向对象 (类和对象的关系)
- 面向对象第二课,类和对象的关系
- 面向对象(类与对象的关系)
- 面向对象程序设计中类之间的关系
- 面向对象UML中类关系
- 面向对象UML中类关系
- 面向对象UML中类关系
- 面向对象UML中类关系
- 面向对象UML中类关系
- 面向对象UML中类关系
- 面向对象设计原则及类和类的关系
- java中的面向对象和类之间的关系
- 面向对象中组合和继承的关系
- 面向对象中组合和继承的关系
- 面向对象<类的三大关系>
- 面向对象中关系和对比
- 学习PrintWriter类
- quartus时序分析文档自我理解与翻译(开题)
- 用activiti 工作流 实现简单的请假 附带源码
- Foobar ASIO 播放速度异常
- MFC添加图片,声音等资源文件
- 面向对象中类和类的关系
- Java 排序之 堆排序
- OC常用方法,最全.
- 【Android开发-4】进入实践,最喜欢折腾的计算器
- uva 11534 - Say Goodbye to Tic-Tac-Toe(Nim和)
- Blog Tester
- MFC获得主窗口和父窗口指针
- C++ primer(第五版) 练习 6.30 个人 code
- Codeforces Spyke Chatting