类之间的关系:
1、依赖关系:
1、定义:类A为完成某个功能,会引用类B,使用类B提供的功能,则称类A依赖类B
2、体现:在代码上,类A的某方法中的参数、局部变量、返回值或静态方法的调用,使用了类B,则表示类A引用了类B
3、生命周期:
1、关系的产生:包含该关系的方法被调用时,开始产生依赖关系
2、关系的销毁:随着该方法结束,两者之间的依赖赖关系随之结束
3、特点:
1、耦合程度:耦合最小的一种关系,即类B变更代码时对类A的影响很小
2、关系持续时长:持续时间短,仅在方法被调用时产生,方法结束则依赖关系结束。
2、关联关系:
1、定义:表示类A与类B之间是有一定关联,但是这种关联的程度可能是很明显,也可能不明显。
2、体现:在代码上,类B作为类A的成员变量(即类A持有类B的实例)
3、生命周期:(作为成员变量)
1、关系的产生:
方式1、在类A的构造方法中创建并注入类B的实例,这种方式会随着类A实例的创建而产生两者的关联关系(即组合关系)
方式2、通过特定的注入方法将类B实例注入到类A实例中,这种方式会随着注入方法的调用而产生两者的关联关系
方式3、当作为成员变量的可被外部类直接访问,直接对成员变量赋值时两者关系产生
2、关系的销毁:
1、类A实例被垃圾回收时,两者关系结束(包含上面关系产生的方式1中,或类B实例只被类A实例所持有(唯一))
2、通过特定的清理方法,将类A中持有类B的成员变量置为null,当该清理方法调用后,两者关系结束
3、当作为成员变量的可被外部类直接访问,直接对成员变量置为null时两者关系结束
4、特点:
1、耦合程度:耦合比依赖关系更强,即类B变更代码时对类A的影响有一定影响
2、关系持续时长:持续时间中等
5、分类:根据关联程度,从语义上可分为:
1、聚合关系:在关联关系下的两个类,若在语义上符合 集体与个体(整体与部分)之间的关系,在语义上强调个体能脱离集体而独立存在。即类A实例不负责类B实例的生命周期
2、组合关系:在关联关系下的两个类,若在语义上符合 个体与组成部分(整体与部分)之间的关系,在语义上强调组成部分必须依靠个体,不能独立存在(同生同灭)。即类A实例负责管理类B实例的生命周期
3、普通依赖关系:在关联关系下的两个类,若在语义上不符合聚合关系和组合关系的情形
6、聚合与组合的区别:
1、聚合没有组合关系紧密
1、聚合关系的类具有不同的生命周期,而组合关系的类具有相同的生命周期
2、聚合关系的类的实例可以独立存在,组合关系的类的实例不能独立存在
2、信息的封装性不同:
1、对于客户端而言,具有聚合关系的两个类A,类B可以独立存在,因此可以同时访问这两个类的实例
2、对于客户端而言,具有组合关系的两个类A, 类B,它必然只能访问到类A的实例(类B的实例被封装起来了)。
3、聚合关系中的成员变量可以独立存在,而组合关系中的成员变量必须依赖于集体才有意义。
3、泛化关系:
1、定义:类与类之间的继承关系,类与接口之间的实现关系
2、体现:在代码中,一个类继承另一个类,或实现某接口
3、生命周期:
1、关系的产生:
1、两者的关系会在子类或实现类的进行类加载时建立起来
2、关系的销毁:
1、两者的关系会在子类或实现类被卸载时(无任何强引用的情况下GC)结束
4、特点:
1、耦合程度:高,即类或接口变更代码时必定会引起另一个类的修改
2、关系持续时长:持续时间较长