java中继承和组合的区别

子类继承父类,父类的所有属性和方法都可以被子类访问和调用。组合是指将已存在的类型作为一个新建类的成员变量类型,又叫“对象持有”。

通过组合和继承,都可以实现系统功能的重用和代码的复用。但是,继承和组合也一些区别:

区别1、子类继承父类后,子类可以根据自己的需求重写父类方法的实现细节,也就是说,父类方法的实现细节对子类是可见的,所以继承又被称为“白盒复用“。

而将部分类组合成整体类时,只要求建立一个好的接口,整体类和部分类之间不会关心各自的实现细节,所以被称为“黑盒复用”。

区别2、继承是在编译时刻静态定义的,即是静态复用,在编译后子类和父类的关系就已经确定了。而组合是运用于复杂的设计,它们之间的关系是在运行时候才确定的,即在对对象没有创建运行前,整体类是不会知道自己将持有特定接口下的哪个实现类。在扩展方面组合比继承更具有广泛性。

区别3、继承中子类会重写父类的某些方法的实现,设计模式中认为这是一种破坏了父类的封装性的表现。这个结构会导致的结果是父类实现的任何变化,必然导致子类的改变。然而组合这不会出现这种现象。

对象的组合还有一个优点就是有助于保持每个类被封装,并被集中在单个任务上(类设计的单一原则)。这样类的层次结构不会扩大,一般不会出现不可控的庞然大类。而类的继承就可能出来这些问题,所以一般编码规范都要求类的层次结构不要超过3层。组合是大型系统软件实现即插即用时的首选方式。

“优先使用对象组合,而不是继承”是面向对象设计的第二原则。

理想情况下,我们不需要创建新的组件来完成代码复用,而只需要通过对象组合的方法来拼装已存在的组件以获取新的功能。但这种情况很少出现,因为在实际情况中,现有的构建总是不够,而通过继承来复用代码往往要比通过组合对象容易得多。所以,继承和组合这两种方法并存于实际的软件开发过程中。

原文地址:https://www.cnblogs.com/shakinghead/p/7452926.html