继承与组合
目录
一:概述
1.继承
我们都知道Java是一种面向对象(Object)的编程语言,而面型对象的特征就包括抽象、继承、多态、封装。而这次所说的继承就是其中之一。继承是面向对象中的一个非常重要的特性。
通过继承,子类可以使用父类中的一些变量和方法,从而提高代码的复用性,减少代码量,提高开发效率。在Java语言中,被继承的类叫做基类或者父类,继承父类的类叫做派生类或者子类。继承的实现是通过关键字extends来实现的。
具体用法:
class 子类名 extends 父类名;
2.组合
组合是指在新的类里面创建原有累的对象,重复利用已有类的功能,起作用与继承一样都是提高代码的复用性。
二:继承的特性
1)Java语言不支持类的多重继承,也就是说,一个子类做多只能有一个父类 。如果要想实现多重继承,只能通过接口的多重继承来实现。
2)子类只能继承父类的非私有(public、protected)的成员变量和方法。
3)当子类中定义的成员变量与父类中的成员变量重名时,子类中的成员变量会覆盖父类中的成员变量,而不是继承父类中的成员变量。
4)当子类中的方法签名与父类中的方法签名相同(重名)时(前提是个数相同、方法类型相同),子类会覆盖父类中的方法,也不会继承。
三:组合和继承的异同点
1.两者都是实现了代码的复用性,提高了开发效率,减少了代码量。
2.两者都允许在新的类中设置子类对象,只是组合是显式的,而继承是隐式的。
3.两者存在对应关系,组合中的整体类对应继承中的子类。组合中的局部类对应继承类的父类。
上面这个图就可以很清晰的简述两者的关系。Transport表示交通工具对象,Car表示车一类的对象,Tire表示轮胎对象。由此就可以看出来,Car是Transport的一种,因此是一种继承关系(即is-a的关系);而Car包含了多个Tire对象,因此是一种组合关系(即has-a的关系)。如下:
继承 | 组合 |
class Transport{ } class Car extends Transport{ } | class Tire{ } class Car extends Transport{ protect Tire i = new Tire(); } } |
四:继承与组合的选用
在上面就已经提到了,两者都可以提高代码的复用性。但是两者如何选择使用呢?如下:
1.如果两个类的关系不是“is-a”的关系,最好就不要用继承;不要为了减少代码或者提高代码的复用性而使用继承,而导致后期代码结构被破坏,造成代码的 可维护性差。一旦父类被修改,就会影响到其继承的子类,从而增加维护难度和成本(需求老是改的话,牵一发而动全身)。
2.不要因为实现多态而使用继承,如果class之间没有extends的关系,就可以通过接口与组合的方式来达到相同的目的。设计模式中的策略模式就是对这一点很好的体现,采用接口与组合的方式比采用继承的方式有更好的可拓展性。
一切都是为了提高代码的复用性(代码重构的原因),避免代码的臃肿,造成后期可维护性变差造成的成本增加。