面向对象编程的基本特征,众所周知:
1. 封装性
2. 继承性
3. 多态性
当然,还会有人提出第四个特性:
4. 抽象性
呵呵,第四个特性包含两个意思,即行为抽象、数据抽象。
行为抽象:体现在类的方法上(包括抽象类以及接口)。
数据抽象:体现在类的属性上(包括抽象类以及接口)。
但是个人认为抽象性应该包含在封装性里面了,但是很多技术大牛说抽象性是一个单独的特性。
每个人思考问题的方式不一样,那么认知也会不一样。
好了,不计较这些琐碎的事情了,我们还是言归正传吧。
类之间的关系大致可以分为下面几种,刚才说过分类的方式有很多种,不要过分在意如何分类,把重点放到分的是什么,毕竟这不是考试。
1. 继承 Inherit
2. 依赖 Dependency
3. 关联 Association
4. 聚合 Aggregation
5. 组合 Composition
6. 实现 Implemention
下面分别针对这几种关系赘述,观点不一致的请明示,互相学习,谢谢!
继承 Inherit
有些书籍也叫做泛化(Generalization),不是泛型,要区别,呵呵。
继承很好理解,通俗地讲就是 A 是 B 的一种,表示为 is-a 关系。代码示例:
package mark.zhang;
/**
* 基类
*
* @author verymark
*
*/
public class Person {
}
package mark.zhang;
/**
* 子類
*
* @author verymark
*
*/
public class Teacher extends Person {
}
依赖 Dependency
表现形式为 A 依赖与 B,B 很可能就是一个方法的参数、局部变量或者是一个方法等。
二者是一种 use-a 的关系。示例:
package mark.zhang;
/**
* 基类
*
* @author verymark
*
*/
public class Person {
Department dep;
// 使用其方法
public void makePlan() {
dep.plan();
}
// 将其当做形参
public void notifyManager(Department dep) {
// ToDo
}
}
类 A (Person)使用类 B (Department),二者构成依赖关系,很明显 Department 的 plan() 有所变化,Person 的 makePlan() 也会改变。
关联 Association
关联的类之间是一种 has-a 的关系。类与类之间的联接,它使一个类知道另一个类的属性和方法。
关联又可以分为单向关联、双向关联。
单向关联,指的是类 A 知道类 B 的存在,或者类 B 知道类 A 的存在。举个例子吧!
package mark.zhang;
/**
* 基类
*
* @author verymark
*
*/
public class Person {
Department dep;
}
双向关联,指的是类 A 、类 B 均知道对方的存在。
package mark.zhang;
/**
* 基类
*
* @author verymark
*
*/
public class Person {
Department dep;
}
package mark.zhang;
public class Department {
Person manager;
}
可以看出单向关联易于维护。
聚合 Aggregation
聚合与组合其实都是关联关系的一种。但是由于他们很特殊,单独说说呗!
聚合表现一种整体与个体的关系,比如公司与员工之间、篮球队与队员之间的关系。
关联强调类之间的平等,而聚合往往是不平等的。
package mark.zhang;
public class BasketballTeam {
TeamMember member;
Basketball ball;
}
可见篮球队是有篮球和队员等组成的,这是一种聚合关系。
组合 Composition
组合也叫做合成,是一种比较强(强于聚合关系)的关联关系,他强调一种整体与部分的关系。比如说人与身体器官的关系。
package mark.zhang;
/**
* 基类
*
* @author verymark
*
*/
public class Person {
Header header;
Hander hander;
Heart heart;
}
从这里我们也可以看出类之间除了继承还可以聚合或者组合,因为继承加强了类与类之间的耦合度,所以在做设计的时候可以考虑聚合或者组合。
实现 Implemention
这种关系指的是实现接口,一个类实现某个接口必须实现其提供的抽象方法。
在文章的最后跟大家分享一个话题:这是什么关系?
看实例代码:
package mark.zhang;
import java.util.ArrayList;
/**
* 基类
*
* @author verymark
*
*/
public class Person {
public void save(Person contacs) {
ArrayList<Person> myContacs = new ArrayList<Person>();
myContacs.add(contacs);
}
}
有人说是一种反射,你觉得是吗?求解中!