聚合与组合的区别

今天碰到一个题,问的是聚合和组合的区别,不是很清楚,到网上搜了一段话,摘录如下:

 

聚合:表示两个对象之间是整体和部分的弱关系,部分的生命周期可以超越整体。如电脑和鼠标。

组合:表示两个对象之间是整体和部分的关系,部分的生命周期不能超越整体,或者说不能脱离整体而存在。组合关系的“部分”,是不能在整体之间进行共享的。

不过,如果你要说,眼睛可以移植,是不是说可以脱离人而存在,它们就不是组合关系了?其实,UML中对象的关系都是在相应的软件环境或实际场景下定义的,这里区别聚合和组合的关系,关键还是在于它们之中整体和部分的关系强、弱,以及它们之间的依附关系。如果刚才说眼睛可以移植给别人,那你也可以把它认为是聚合,这都要结合实际场景来说明。

另外两个比较重要的关系是关联和依赖:
关联:简单的可以认为,如果一个类作为了另外一个类的属性,那一定是关联关系。但你要知道,聚合是一种特殊的关联,而组合又是一种特殊的聚合。一般的关联我们认为是平级的、无整体部分关系的,如朋友关系。

依赖:对象之间的临时关系,临时性体现在不超越方法的周期。简单的说,在方法使用到的,如参数类,就一定是依赖关系。
(以上文章来源于:http://www.blogjava.net/lukangping/archive/2010/08/01/327693.html

 

is a 关系,那么它是一个集成关系;比如:我 is a 人;再比如菱形、圆形和方形都是形状的一种,那么他们都应该从形状类继承而不是聚合。

has a关系,那么它是一个聚合关系;比如:我 has a 头;再比如电脑是由显示器、CPU、硬盘等组成的,那么你应该把显示器、CPU、硬盘这些类聚合成电脑类,而不是从电脑类继承。

聚合和组合都属于关联,很难区分,但是只要记住一点,区分它们就容易多了:

       处于聚合关系的两个类生命周期不同步,则是聚合关系;处于组合关系的两个类的生命周期同步;eg聚合关系,A创建的时候,B不一定创建;当A消亡时,B不一定消亡。class A{   private  B;}class B{....}组合关系,当创建一个A对象时,也会创建一个B对象;当A对象消亡时,作为A的属性的B对象也会消亡。class A{private B b=new B();....}class B{....}

(以上文章来源于:http://hi.baidu.com/yxj1141/blog/item/e7a95f1d7c886b9886d6b679.html

组合聚合和继承是面向对象编程中不同的关系,它们的区别如下: ### 概念方面 - **继承**:继承是面向对象最显著的一个特性,是从已有的类(父类、父接口)中派生出新的类(子类、子接口),新的类能吸收已有类的数据属性和行为,并能扩展新的能力。在Java中此类关系通过关键字`extends`明确标识 [^3]。 - **聚合**:聚合是指一种整体部分之间的关系,表示个体一般都可以脱离整体独立存在。在聚合中,一个类可以包含其他类的对象,但是被包含的对象也可以不属于该聚合对象。聚合是一种比组合更为弱关联、模糊的关系。例如,一个学校包含多个班级,班级是被聚合的对象,它们可以独立存在,即一个班级可以迁移到另一个学校 [^1]。 - **组合**:组合也是整体部分的关系,但部分整体的生命周期紧密相连,部分不能脱离整体而单独存在,是一种强关联关系。例如,汽车和发动机,发动机是汽车的一部分,没有汽车这个整体,发动机单独的意义就不能很好地体现。 ### 代码表现方面 - **继承**: ```java class Animal { void eat() { System.out.println("Animal is eating"); } } class Dog extends Animal { void bark() { System.out.println("Dog is barking"); } } ``` 这里`Dog`类继承自`Animal`类,`Dog`类可以使用`Animal`类的`eat`方法,并且有自己的`bark`方法 [^3]。 - **聚合**: ```java class Class { // 班级类 } class School { private Class[] classes; public School(Class[] classes) { this.classes = classes; } } ``` `School`类聚合了`Class`类的对象,`Class`对象可以独立于`School`对象存在,一个班级可以从一个学校转移到另一个学校 [^1]。 - **组合**: ```java class Engine { // 发动机类 } class Car { private Engine engine; public Car() { this.engine = new Engine(); } } ``` `Car`类组合了`Engine`类的对象,`Engine`对象的生命周期和`Car`对象紧密相关,没有`Car`对象,`Engine`对象单独存在可能没有实际意义。 ### 关系强度方面 - 继承是一种“is-a”的关系,子类是父类的一种特殊类型,关系紧密。 - 聚合是“has-a”的弱关系,整体和部分可以相互独立存在。 - 组合是“has-a”的强关系,部分依赖于整体存在。 ### 灵活性和耦合度方面 - 继承提高了代码的复用性,但会使子类和父类的耦合度较高,父类的修改可能会影响到子类。 - 聚合组合的耦合度相对较低,尤其是聚合,部分和整体的独立性较强,便于代码的维护和扩展。
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值