对于学习过Java编程语言的同学都会了解,继承是面向对象的一个显著特性。继承是从已有的类中派生出新的类,新的类能吸收已有类的数据和属性,并具有扩展的能力。继承有很多优点,比如它可以在一定程度上提高整个程序代码的复用性,其次它还是对某一批类的抽象,从而能够实现对现实世界更好的建模。
那么倘若我们单纯的从程序代码的复用性角度考虑,组合完全可以替代继承,以下是继承与组合的区别与联系:
- 组合(has-a)冠希可以显式得被包含类(继承中成父类)的对象,而继承(is-a)则是隐式获得父类对象,被包含的类与父类相对应,而组合外部类与子类对应。
- 组合关系在运行期决定,而继承关系则在编译期就已经决定。
- 组合是在组合类与被包含类之间的一种松耦合(有效降低组合类与被包含类的依赖性,无须担心会破坏对方)关系,而继承则是父类与子类之间的一种紧耦合关系。
- 当选择使用组合关系时,在组合类中包含了外部类的对象,组合类可以根据自身需求,调用外部类相关方法,而使用继承关系时,子类无条件继承父类的所有属性与方法(构造方法除外),并无选择权。
- 组合类不便于修改,它仅仅简单的调用了被包含类的相关接口,而继承除了复用其父类的接口外,同样具有重写功能,可以覆盖这些接口,从而轻松修改父类默认实现,这个特征也是组合关系所不具备的。
- 从逻辑上来说,组合关系实现的仅仅是整体与部分的一种思想。而继承则是一种可回溯关系,子类代表父类的对象。
- 通俗理解:组合”我雇了一个保姆打理家务“,继承”我的父亲再帮我打理家务。
- 两者之间有什么样的关系使用组合,而两者之间是什么样的关系时用继承。