面向对象中类和类的关系
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
⾯向对象中类和类的关系
在⾯向对象⽅法中,我们在确定了类及类的属性和⽅法后。
不可避免的要研究类和类之间的关系,正是这些关系将整个事情串联起来。
使彼此之间有了联系,就像现实⽣活中,⼈与⼈交往中存在着不同的关系。
了解这些关系,对于我们开发系统百利⽽⽆⼀害,能够让我们轻松、⾼效的⼯作,相同像我们在⽇常⽣活中处理好⼈与⼈之间的关系。
会给我们带来巨⼤的优点。
那么我们就来认识⼀下。
⾯向对象中类与类之间有那些关系。
类和类之间的关系⼤概能够分为⼀下⼏种类型:泛化关系(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类⽽独⽴存在
②信息的封装性不同
在聚合关系中,client能够同⼀时候了解A类和B类,由于他们都是独⽴的
⽽在组合关系中,client仅仅认识A类,根本就不知道B类的存在,由于B类被严密的封装在A中。
③⽣命周期不同:
聚合是总体与部分之间是可分离的,他们能够具有各⾃的⽣命周期。
不会由于⼀⽅的消失还有⼀⽅跟着消失。
聚合是总体与部分是不可分的,总体的⽣命周期结束也就意味着部分的⽣命周期结束。