类与类之间的关系有泛化(继承)、实现、关联、依赖、聚合、组合
泛化(继承):指的是一个类(称为子类、子接口)继承另外一个类(称为父类、父接口)的功能。在UML类图设计中,泛化(继承)使用一条带空心的三角箭头的实线表示,从子类指向父类,或者是从子接口指向父接口。
示例代码:
public class Father{
public Collection doSomething(HashMap map){
System.out.println("父类方法被执行");
return map.values();
}
}
class son extends Father{
//这里我们使用了方法重载,相同的方法名,不同的参数类型叫做方法重载
//在不同的类中也可以使用重载
//区分重写与重载 重写是指方法名和参数都相同,但是方法体不同,一般在使用时会在方法签添加@Overide 编译器复制检查代码规范
public Collection doSomething(Map map){
System.out.println("子类方法被执行");
return map.values();
}
}
实现:实现指的是一个类实线interface接口的功能。在UML设计中通过使用一条带空心三角箭头的虚线表示,从类指向实现的接口。
示例代码:
interface IBook{
public void name();
}
class NovelBook implements IBook{
public void name(){
System.out.println("我是一本书");
}
}
在UML类图中实现和继承可以联合记忆,两者区别一个是实线,一个是虚线。
依赖:类A使用到类B,但这中使用关系是具有偶然性、临时性的,属于若耦合。
在代码上体现在,类A中含有类B的局部变量,类图如下所示;
关联:关联体现的是两个类之间语义级别的一种强依赖关系,属于强耦合。这种关系比依赖强、不存在依赖关系的偶然性、关联关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的。关联可以是单向、双向的。体现在代码上是,类A中有类B中的成员变量。UML类图设计中,关联关系由关联类A指向被关联类B的带箭头的实线表示。
类图如下所示:
示例代码如下所示:
class abstract class AbstractGun{
//抽象射击方法
public void shoot();
}
class Rifle extends AbstractGun{
//设计射击方法实现
public void shoot(){
System.out.println("步枪射击");
}
}
class Soldier{
//定义士兵的枪支
private AbstractGun gun;
public void setGun(AbstractGun _gun){
this.gun=_gun;
}
public void killEnemy(abstractGun gun){
System.out.println("士兵开始杀人");
gun.shoot();
}
}
class client{
public static void main(String [] args){
Soldier solder=new Soldier();
solder.setGun(new Rifle());
solder.killEnemy();
}
}
类图如下:
Client与Soldier之间为依赖关系,在main方法中有如下内容
Soldier solder=new Soldier();
Soldier与AbstractGun之间为关联关系关系,Soldier中有AbstractGun的类变量private AbstractGun gun;
Rifle与AbstractGun之间为继承关系。
关联和依赖关系可以联合记忆,在UML类图中两者区别在与连线的划分,实质为两个类之间耦合性的强弱,耦合性强的为依赖关系,耦合性弱的为关联关系。
聚合:聚合是关联关系的一种特例,体现在整体与部分到的关系,即has-a的关系。此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、公司与员工的关系等。表现在代码上与关联关系是一致的。在UML类图中聚合关系以空心菱形加实线箭头表示。
组合:组合也是关联关系的一种特例,体现的是一种contains-a的关系,这种关系比耦合更强,也称为强聚合。它同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体声明周期结束意味着部分生命周期结束。比如人和人的代码。表现在代码层面上与关联关系是一致的。在UML类图设计中,组合关系以实心菱形加实现箭头表示。