您的位置:首页 > 编程语言 > Java开发

[Java] 组合与继承的区别

2016-04-06 21:46 134 查看
组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承是隐式地做。

那两者之间的区别是怎样的呢?又该如何选择呢?

很多人对组合理解地还不是很好,所以我们先来理解一下组合:

组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情况。

以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"(有一个)的关系则是用组合来表达的。

尽管面向对象编程对继承极力强调,但在开始一个设计时,一般应优先选择组合(或者可能是代理),只在确实必要时才使用继承。

到底是该用组合还是继承,一个最清晰的判断方法就是问问自己是否需要从新类向基类进行向上转型。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: