java类和类之间的关系
概览
5种关系
- 依赖(dependency)
- 关联(association)
- 聚合(aggregation)
- 组合(composition)
- 继承(inheritance)可以更加细得分为
实现
(realization)和泛化
(generalization)
从上至下依赖关系逐渐增强
详细说明区别
其实依赖
、 关联
、聚合
、组合
都是差不多的,在日常的表达中也很容易混为一谈,特别是聚合和组合更加容易混为一谈(我感觉也没必要区分这么细,都是 “我中有你”)。
详细的含义如下
- 依赖:单向,类A依赖类B,是A在局部变量、方法入参、静态调用中出现了B(我觉得方法出参中出现B应该也算依赖),类似
use a
- 关联:可以单向 和 双向(避免双向,它是一种循环依赖),类之间是一种比较平等的关系。类似
has a
- 聚合:是特殊的关联,跟关联的区别仅仅是语义上,比如关联的两个类的关系比较平等,但是聚合是不平等的,聚合是整体和个体的区别。对象的生命周期是 “整体死了,但是个体还在”(详细看代码以加深印象)
- 组合:是特殊的聚合,也仅仅是语义的差别。聚合是 “整体死了,个体还在”,组合是 “整体死了,个体也死了”,个体是整体的组成部分(详细看代码以加深印象)
- 继承:就是类继承类,类继承抽象类,类实现接口,接口继承接口这些关系。跟上面4个很好区分。其中也可以再细分为
实现
和泛化
,实现就是类实现接口,泛化就是类继承类、类继承抽象类、接口继承接口。泛化是一种is a
用代码说明区别
- 依赖
// use a
// 方法入参的依赖
public class Person {
public void drink(Water w) {
}
}
// 局部变量的依赖
public class Person {
public void goOut() {
Car car = new Car();
}
}
// 静态调用的依赖
public class Person {
public void born() {
String idCardNo = IdCardUtil.getIdCardNo();
}
}
// 方法出参的依赖
public class Person {
public Profile getProfile() {
}
}
- 关联(是一种平等的关系),表示
has a
(有一个),比如这里的 “人有一个手机”
// has a
public class Person {
private Phone phone;
public void setPhone(Phone phone) {
this.phone = phone;
}
public Phone getPhone() {
return this.phone;
}
}
- 聚合:整体死了个体还没死
// Team被JVM回收时,persons不被回收,个体还存在
public class Team {
private List<Person> persons;
public Team(List<Person> persons) {
this.persons = persons;
}
}
- 组合:整体死了,个体也死,个体是整体的组成部分
// Person被JVM回收后,各部分也被回收
public class Person {
private Head head;
private Body body;
private List<Arm> arms;
private List<Leg> legs;
public Person() {
this.head = new Head();
this.body = new Body();
this.arms = Lists.newArrayList<Arm>(new Arm("左臂"), new Arm("右臂"));
this.legs = Lists.newArrayList<Leg>(new Leg("左腿"), new Leg("右腿"));
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135283.html