20180317 java java面向对象-组合关系
先回顾一下继承关系
继承关系:子类可以继承到父类中部分的成员,那么此时子类是可以修改到父类的信息的。
所以继承关系破坏了封装(即本身封装和继承关系就存在天然的矛盾性)。
为什么引入继承呢? 为了代码复用。
而解决代码复用问题,不一定非要使用继承关系,也可以使用组合关系(又叫包含关系)。
继承关系叫 is a的关系;
组合关系叫 has a的关系。
举例:
A没钱,但是想开豪车,想吃火锅,
解决该问题有两个方法:
方式一:认一个富豪干爹(继承关系);
方式二:把一个富豪干爹绑架到家里,让他给我买个豪车,他就买了,让他给我买火锅,他就买了(组合关系,它包含在我家里了,我就可以使用它的功能了)。
以上表示的就是组合关系。
在继承关系中,为了复用父类的代码,可能会让子类具有不该有的功能(子类继承了父类太多的功能,很多功能子类都用不上)。
eg:
子类继承ArrayUtil类的排序代码如下:
//继承关系
Class CombinitionDemo extends ArrayUtil
{
Int[] arr = [2,5,1,7,3];
Sort(arr);
}
Public static void main()
{
NewCombinitionDemo().test();
}
这破坏了ArrayUtil类的封装性。
//组合关系
Class CombinitionDemo
{
Private Arrayutil util = new arrayUtil();
Public void test()
{
Int[] arr = [2,5,1,7,3];
Sort(arr);
}
}
Public static void main()
{
NewCombinitionDemo().test();
}
如果A类为了得到B类的功能或行为,有两种手段:
1、若A类是B类的一种特殊情况,就使用继承关系
2、其他情况使用组合关系。