关联(Association)关系体现的是两个类、或者类与接口之间语义级别的一种强依赖关系,比如用户和用户的地址。
这种关系比依赖更强、不存在依赖关系的偶然性、关系也不是临时性的,一般是长期性的,而且双方的关系一般是平等的、关联可以是单向、双向的。
表现在代码层面,为被关联类B以类属性的形式出现在关联类A中,也可能是关联类A引用了一个类型为被关联类B的全局变量。
1️⃣单向关联
✴️UML图演示:
以上是单向关联的实例,需要类Customer知道类Address,而不需要类Address知道类Customer,那么就是单向关联。在UML类图中,用实线连接有关联关系的对象所对应的类,并通过有无箭头区分不同的关联关系。
✳️Java代码演示:
public class Customer {
private Address address;
……
}
public class Address {
……
}
这里就是上述的:表现在代码层面为被关联类Address以类属性的形式出现在关联类Cusomer中。
2️⃣双向关联
✴️UML图演示:
以上是双向关联的实例,类Customer需要知道类Product,而类Product也需要知道类Cusomer,那么这两个类就应该是双向关联的。
✳️Java代码演示:
public class Customer {
private Product[] products;
……
}
public class Product{
private Customer customer;
……
}
3️⃣自关联
✴️UML图演示:
以上是自关联的实例,自关联体现为类的属性类型为类本身,如链表、树结构。
✳️Java代码演示:
public class Node {
private Node subNode;
……
}
4️⃣多重性关联
✴️UML图演示:
以上是多重性关联的实例。多重性关联关系又称为重数性(Multiplicity)关联关系,表示两个关联对象在数量上的对应关系。在UML中,对象之间的多重性可以直接在关联直线上用一个数字或一个数字范围表示。
【补充】多重性与UML表示方式的对应关系:
| UML表示方式 | 多重性 |
| — | — |
| 1…1 | 表示另一个类的一个对象只与该类的一个对象有关系 |
| 0…* | 表示另一个类的一个对象只与该类的零个或多个对象有关系 |
| 1…* | 表示另一个类的一个对象只与该类的一个或多个对象有关系 |
| 0…1 | 表示另一个类的一个对象没有或只与该类的一个对象有关系 |
| m…n | 表示另一个类的一个对象与该类最少m,最多n个对象有关系 |
✳️Java代码演示:
public class Form {
private Button[] buttons; //定义一个集合对象
……
}
public class Button {
…
}
聚合(Aggregation)关系是关联关系的一种特例,体现的是整体与部分、拥有的关系,即has-a的关系。
此时整体与部分之间是可分离的,他们可以具有各自的生命周期,部分可以属于多个整体对象,也可以为多个整体对象共享。比如计算机与CPU、车和引擎的关系等。
✴️UML图演示:
以上是聚合关系的实例。在UML中,聚合关系用带空心菱形的直线表示 ,整体指向部分,空心菱形靠近整体。
✳️Java代码演示:
public class Car {
private Engine engine;
public Car(Engine engine) { //构造注入
this.engine = engine;
}
public void setEngine(Engine engine) { //设值注入
this.engine = engine;
}
……
}
public class Engine {
……
}
表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
组合(Composition)关系也是关联关系的一种特例,体现的是一种contains-a的关系,这种关系比聚合更强,也称为强聚合。
同样体现整体与部分间的关系,但此时整体与部分是不可分的,整体的生命周期结束也就意味着部分的生命周期结束。比如你的头和你的嘴巴。
✴️UML图演示:
以上是组合关系的实例,在UML中,组合关系用带实心菱形的直线表示,整体指向部分,实心菱形靠近整体。
✳️Java代码演示:
public class Head {
private Mouth mouth;
public Head() {
mouth = new Mouth(); //实例化成员类
}
……
}
public class Mouth {
……
}
表现在代码层面,和关联关系是一致的,只能从语义级别来区分。
泛化(Generalization)关系是一种继承关系,用于描述父类与子类之间的关系,父类又称为基类或超类,子类又称为派生类是一种继承关系。
它表示一般与特殊的关系,指定了子类如何特化父类的所有特征和行为。例如:学生和老师是人类的一种,即有学生、老师的特性也有人类的共性。
✴️UML图演示:
以上是泛化关系的实例,在UML中,泛化关系用带空心三角形的直线来表示,箭头指向父类。
✳️Java代码演示:
//父类
public class Person {
protected String name;
protected int age;
public void move() {
……
}
public void say() {
……
}
}
//子类
public class Student extends Person {
private String studentNo;
public void study() {
……
}
如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费学习大礼包,带大家一起学习,给大家剖析Python兼职、就业行情前景的这些事儿。
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、全套PDF电子书
书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。
四、入门学习视频
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
成为一个Python程序员专家或许需要花费数年时间,但是打下坚实的基础只要几周就可以,如果你按照我提供的学习路线以及资料有意识地去实践,你就有很大可能成功!
最后祝你好运!!!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!