【java】UML类图与常见类关系
由于吕大爷十分在意类关系的绘制,但是我又没有学明白这个东西,就打算自己整理一下。又由于某人说百香果果茶不好喝,我直接is-a sb泛化关系警告!!!
感谢上述两人对本博客的动力赞助,感觉很好,下次不需要了。
一、UML图
UML图属于结构图,常被用于描述一个系统的静态结构。在一个UML中通常包含类的UM图、接口的UML图、泛化关系的UML图、关联关系的UML图、依赖关系的UML图和实现关系的UML图。
在类的UML图中,使用一个长方形描述一个类的主要构成,将长方形垂直的分为3层。
(1)顶部第一层是名字层,字体为正,表明是具体类;字体为斜,表明是抽象类
(2)第二层是变量层,也称为属性层,列出类的成员变量及类型,格式是**“变量名字:类型”**,根据需要可以只列出重要变量的名称
(3)第三层是方法层,也称为操作层,列出类中的方法,格式是“方法名字:类型”,根据需要可只列出重要的方法
二、常见的类关系
强弱顺序:
泛化=实现>组合>聚合>关联>依赖
1.泛化关系
关系描述:表示is-a关系,子类继承父类
标识:带三角箭头的实线
指向:由子类指向父类
图示:
代码:
public class zyz extends sb{
}
2.实现关系
关系描述:表示接口和实现关系
标识:带三角箭头的虚线
箭头指向:实现类指向接口
图示:
代码:
interface studyEnglish{
void read();
void write();
}
public class zyz implements studyEnglish{
public void read(){
System.out.println("zyz很爱读英语");
}
public void write(){
System.out.println("zyz很爱写英语");
}
public static void main(String[] args){
zyz.read();
zyz.write();
}
}
笑死,发现自己连接口是什么也不太清楚,那我们就开个小差,学学接口是啥??
首先,很特别的是接口只有方法的特征,没有方法的实现,也就是说括号里面啥都没有,原来接口是个胸无点墨的纸老虎,但也恰因如此,这些方法可以在不同的地方被不同的类实现,在各个类中自由穿梭,随意塑造成我们需要的样子。
其次,接口里面的全部都是全局变量和公共的抽象方法,即默认属性是public static final,这也是为了解决java无法多继承的一种手段,但在实际中更多的作用是制定标准。
再然后,规定了要实现接口,就必须要实现接口中的规定实现所有方法,例如上述例子中的read()和write()这两个方法,这样才能承认这个类实现了这个接口。
需要注意点:
1.不能直接实例化一个接口,因为接口中的方法都是抽象的,没有方法体,那就需要我们使用接口类型引用指向一个实现了该接口的对象,并且可以调用这个接口中的方法。
接口的声明已省略
class YouPan implements USB{
public void read(){
System.out.println("U盘正在通过USB功能读取数据");
}
public void write(){
System.out.println("U盘正在通过USB功能写入数据");
}
}
class JianPan implements USB{
public void read(){
System.out.println("键盘正在通过USB功能读取数据");
}
public void write(){
System.out.println("键盘正在通过USB功能写入数据");
}
}
public class Main{
public static void main(String[] args){
}
2.一个类可以接多个接口,一个接口可以继承于另一个接口,或者更多接口,即可以多继承
3.接口也可用来实现解耦
4.并不是所有接口内部都有方法,比如Seriallizable接口,其作用是使得对象能够“序列化”,但其中却没有任何内容,故这个接口只是一个标识,用来标志一个类具有序列化的功能。
3.依赖关系
关系描述:类之间关系最弱的一种关联方式,表示use a。代码中一般指有局部变量、函数参数、返回值建立的对于其他对象的调用关系。
标识:带箭头的虚线
图示:
箭头指向:使用类指向被依赖类
代码实现:
public zyz abstract class zyz{
public void Grow(){
Air air = new Air();
Water water = new Water();
}
public Water Drink(Water water){
}
}
public class Air{
}
public class Water{
}
依赖关系的实现:
如果Air、Water类是全局的,则zyz可以调用他们
Air、Water类是zyz类里的方法中的局部变量
Air、Water类作为zyz类中的方法的参数或者返回值
4.关联关系
关系描述:表示对象之间的一种引用关系,比如客户类与订单之间的关系。这种关系通常使用类的属性表达。关联分为一般关联、聚合关联与组合关联。一般关联又可分为单项关联和双向关联
标识:带箭头的实线
图示:
代码实现:
class zyz{
private course c;
}
class course{
}
如果实例化zyz类的对象,那么同时会有一个course类的对象被实例化,简言之,course作为zyz的属性存在
5.聚合关系
关系描述:表示has a的关系,是一种不稳定的包含关系,较强于一般关联,有整体与局部的关系,并且没有了整体,局部也可单独存在。如公司和员工的关系,公司包含员工,但公司没有,员工依然还在,只不过可能换一个工作罢了。
标识:带空心菱形的实线
图示:
箭头指向:菱形指向整体,箭头指向个体
代码实现:
public class zyzGroup{
public List<zyz> zyzs;
public zyzGroup (List<zyz> zyzs){
this.zyzs=zyzs;
}
}
6.组合关系
关系描述:表示contain a的关系,是一种强烈的包含关系。组合类负责被组合类的生命周期,是一种更强的聚合关系,部分不能脱离整体存在,如公司和部门的关系,没有了公司,部门也不能存在了,还有人和大脑等等。
标识:带实心菱形箭头
图示:
箭头指向:菱形指向整体,箭头指向个体
代码实现:
class zyz{
private brain b = new brain();
}
class brain{
}
组合类的构造函数中包含一个类的实例化,表明zyz类在事例化之前,一定要先实例化brain类,这两个类紧密耦合在一起。