[Java] 组合与继承的区别

本文通过一个具体的Car类实例,深入浅出地介绍了面向对象编程中组合与继承的概念及其区别。组合通常用于新类中使用现有类的功能,而继承则用于创建一个现有类的特殊版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合和继承都允许在新的类中放置子对象,组合是显式地这样做,而继承是隐式地做。

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


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

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

以car对象举例:

[java]  view plain  copy
  1. //Composition with public objects.  
  2. package exampleChapter7;  
  3.   
  4. class Engine {  
  5.     public void start() {}  
  6.     public void rev() {}  
  7.     public void stop() {}  
  8. }  
  9.   
  10. class Wheel {  
  11.     public void inflate(int psi) {}  
  12. }  
  13.   
  14. class Window {  
  15.     public void rollup() {}  
  16.     public void rolldown() {}  
  17. }  
  18.   
  19. class Door {  
  20.     public Window window = new Window();  
  21.     public void open() {}  
  22.     public void close() {}  
  23. }  
  24.   
  25. public class Car {  
  26.     public Engine engine = new Engine();  
  27.     public Wheel[] wheel = new Wheel[4];  
  28.     public Door  
  29.         left = new Door(),  
  30.         right = new Door(); // 2-door  
  31.     public Car() {  
  32.         for(int i = 0; i < 4; i++)  
  33.             wheel[i] = new Wheel();  
  34.     }   
  35.     public static void main(String[] args) {  
  36.         Car car = new Car();  
  37.         car.left.window.rollup();  
  38.         car.wheel[0].inflate(72);  
  39.     }  
  40. ///:~  

可以明显看出,这个例子的类:车,拥有发动机,门,窗等等部件,是一种所有关系。


继承呢?

在继承的时候,使用某个现有类,并开发一个它的特殊版本。通常,这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。


两者的区别呢?

还是以car为例,略微想一下就会发现,用一个“交通工具”来构成一部“Car”是毫无意义的,因为Car并不包含“交通工具,它仅

仅是一种交通工具(is -a 的关系)

组合一般是将现有类型作为新类型底层实现的一部分来加以复用,而继承复用的是接口。


所以总结来说,“is-a ”(是一个)的关系是用继承来表达的,而“has-a"(有一个)的关系则是用组合来表达的。


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

到底是该用组合还是继承,一个最清晰的判断方法就是问问自己是否需要从新类向基类进行向上转型。



转载来源:http://blog.youkuaiyun.com/h_meichuan/article/details/51078713
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值