[Java] 组合与继承的区别
2016-04-06 21:46
134 查看
组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承是隐式地做。
那两者之间的区别是怎样的呢?又该如何选择呢?
很多人对组合理解地还不是很好,所以我们先来理解一下组合:
组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情况。
以car对象举例:
可以明显看出,这个例子的类:车,拥有发动机,门,窗等等部件,是一种所有关系。
那继承呢?
在继承的时候,使用某个现有类,并开发一个它的特殊版本。通常,这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。
两者的区别呢?
还是以car为例,略微想一下就会发现,用一个“交通工具”来构成一部“Car”是毫无意义的,因为Car并不包含“交通工具,它仅仅是一种交通工具(is -a 的关系)
组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。
所以总结来说,“is-a ”(是一个)的关系是用继承来表达的,而“has-a"(有一个)的关系则是用组合来表达的。
尽管面向对象编程对继承极力强调,但在开始一个设计时,一般应优先选择组合(或者可能是代理),只在确实必要时才使用继承。
到底是该用组合还是继承,一个最清晰的判断方法就是问问自己是否需要从新类向基类进行向上转型。
那两者之间的区别是怎样的呢?又该如何选择呢?
很多人对组合理解地还不是很好,所以我们先来理解一下组合:
组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情况。
以car对象举例:
//Composition with public objects. package exampleChapter7; class Engine { public void start() {} public void rev() {} public void stop() {} } class Wheel { public void inflate(int psi) {} } class Window { public void rollup() {} public void rolldown() {} } class Door { public Window window = new Window(); public void open() {} public void close() {} } public class Car { public Engine engine = new Engine(); public Wheel[] wheel = new Wheel[4]; public Door left = new Door(), right = new Door(); // 2-door public Car() { for(int i = 0; i < 4; i++) wheel[i] = new Wheel(); } public static void main(String[] args) { Car car = new Car(); car.left.window.rollup(); car.wheel[0].inflate(72); } } ///:~
可以明显看出,这个例子的类:车,拥有发动机,门,窗等等部件,是一种所有关系。
那继承呢?
在继承的时候,使用某个现有类,并开发一个它的特殊版本。通常,这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。
两者的区别呢?
还是以car为例,略微想一下就会发现,用一个“交通工具”来构成一部“Car”是毫无意义的,因为Car并不包含“交通工具,它仅仅是一种交通工具(is -a 的关系)
组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。
所以总结来说,“is-a ”(是一个)的关系是用继承来表达的,而“has-a"(有一个)的关系则是用组合来表达的。
尽管面向对象编程对继承极力强调,但在开始一个设计时,一般应优先选择组合(或者可能是代理),只在确实必要时才使用继承。
到底是该用组合还是继承,一个最清晰的判断方法就是问问自己是否需要从新类向基类进行向上转型。
相关文章推荐
- Java 方法应用实例01
- springmvc(2)
- Java学习·模板方法模式
- java中的基本数据类型
- java 大数
- [置顶] JavaSE学习笔记_14:Java-Runtime类
- eclipse远程连接hadoop单机模式出现的问题
- java(20)--单例模式总结
- Java String.split()用法小结
- Struts2 action中不要将方法以get开头!!!
- [置顶] JavaSE学习笔记_16:Java-Calendar类
- Java的【向上转型】和【向下转型】
- Java大数简单题---Yet another A + B
- java继承时初始化的执行顺序
- opengl es2.0 eclipse+adt+android sdk+ndk 试过jni都没问题。报错原因求解决????
- 第一天学习java
- JAVA日志框架分类简介
- [置顶] JavaSE学习笔记_15:Java-Date类
- [置顶] JavaSE学习笔记_17:Java-Math&Random类
- 为什么用Java(转载知乎)