面向对象: 类之间关系

面向对象编程的基本特征,众所周知:


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); } }


在 Person 类中 save 方法用于保存联系人的,其中形参就是 Person 对象,这体现一种什么关系?


有人说是一种反射,你觉得是吗?求解中!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值