面向对象编程的三大要素:
1.封装
所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏
2.继承
继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。广义继承包含了类继承以及接口继承
3.多态
所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。
类或模块的关系(高内聚低耦合)
1.继承
继承是一种高内聚紧耦合的关联关系,即基类的任何更改,子类也可能会因为继承跟着修改。使用继承需要考虑children和parent是is的关系,同时子类是否需要用到基类所有被继承的接口。
2.实现
实现又叫接口继承,是指子类仅使用接口的属性以及方法的定义,并需提供方法的具体实现。接口继承也是一种高内聚紧耦合的关联管理,一旦接口发生改变,所有实现它的类都需要跟着修改。
3.聚合/组合
聚合/组合是一种低内聚松耦合的关联关系,表现在类的关联是has-a的关系,比如上图中计算机包含键盘鼠标,人有心肺等器官。
聚合和组合的区别:
1)聚合:整体和部分的弱关联关系,整体和部分可以单独的存在,不存在生命周期的问题(上图中的左半图)
public class Computer{
private Keyboard mKeyboard;
private Mouse mMouse;
public Computer(Keyboard k,Mouse m){
mKeyboard = k;
mMouse = m;
}
}
2)组合:整体和部分的强关联关系,部分的构建依赖于整体的构建,或者整体消亡了,部分也随之消亡。(上图中的右半图)
public class Person{
private Heart mHeart;
private Lung mLung;
public Person(){
mHeart = new Heart();
mLung = new Lung();
}
public void onDestroy(){
mHeart = null;
mLung = null;
}
}
4.关联
聚合/组合也是一种关联,特指has-a的关系,这里的关联指的是”use-a“的广义关联关系。关联关系的指向可以是单向的,也可以是双向的,如上图中左图部分,人使用某种工具做某件事情是单向的,而右图部分,客户和订单是1:n的关联关系。
public class Person{
private Tool mTool;
public Person(Tool tool){
mTool = tool;
}
public void doAction(){
mTool.action();
}
}
5.依赖
图略: 关联中左图Person指向Tool的实线变虚线。
依赖是一种比较弱的耦合关系,类或对象之间没有具体的引用关系,它在代码中表现为局部变量,静态调用等,下面改造关联部分代码进行比较。
public class Person{
//private Tool mTool; (没有引用关联)
public void doAction(Tool tool){
tool.action(); //注入方式调用
}
public void doAction2(){
Tool tool = new Tool(); //内部局部调用
tool.action();
}
public void doAction3(){
Tool.action(); //类静态方法调用
}
}
6.总结
1.引用关系强弱
(继承>=实现) > (组合>=聚合>=关联) > (依赖)
2.关系分类:
个人理解:按照上面圆括号范围划分,可以大致分为3大类,细分为6小类。