A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© itheima01 中级黑马   /  2013-4-3 23:12  /  1669 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 itheima01 于 2013-4-4 00:02 编辑

class A{}   class B extends A{}  
class B {void c (A a ){方法体3} }
方法体3中还需要new一个A来调用A中的方法不?这个和继承有社么区别。。
求组合的详细介绍。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

7 个回复

倒序浏览
这个我第一次看也没明白,继承我知道就是组合没明白,今天刚复习了这里,一下明白了。继承你肯定也知道,把A做为参数传给B就是组合,A包括B   ,B是A的一种就继承  B是A的一部分就组合

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
零件组装成车,但是没有车的功能,车里有has-a零件,这就是组合,宝马奔驰是车的一种,具有车的功能,宝马奔驰是is-a车。我这么理解组合继承对不
回复 使用道具 举报
根据网络上大家对继承和组合的讨论,我简单总结以下几点:
1)组合(has-a)关系可以显式地获得被包含类(继承中称为父类)的对象,而继承(is-a)则是隐式地获得父类的对象,被包含类和父类对应,而组合外部类和子类对应。


2)组合关系在运行期决定,而继承关系在编译期就已经决定了。


3)组合是在组合类和被包含类之间的一种松耦合关系,而继承则是父类和子类之间的一种紧耦合关系。

4)当选择使用组合关系时,在组合类中包含了外部类的对象,组合类可以调用外部类必须的方法,而使用继承关系时,父类的所有方法和变量都被子类无条件继承,子类不能选择。

5)最重要的一点,使用继承关系时,可以实现类型的回溯,即用父类变量引用子类对象,这样便可以实现多态,而组合没有这个特性。

6)还有一点需要注意,如果你确定复用另外一个类的方法永远不需要改变时,应该使用组合,因为组合只是简单地复用被包含类的接口,而继承除了复用父类的接口外,它甚至还可以覆盖这些接口,修改父类接口的默认实现,这个特性是组合所不具有的。

7)从逻辑上看,组合最主要地体现的是一种整体和部分的思想,例如在电脑类是由内存类,CPU类,硬盘类等等组成的,而继承则体现的是一种可以回溯的父子关系,子类也是父类的一个对象。



8)这两者的区别主要体现在类的抽象阶段,在分析类之间的关系时就应该确定是采用组合还是采用继承。



9)引用网友的一句很经典的话应该更能让大家分清继承和组合的区别:组合可以被说成“我请了个老头在我家里干活” ,继承则是“我父亲在家里帮我干活"。

摘自网上---继承与组合的区别——————--

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
我在楼上的理解对不??零件组装成车,但是没有车的功能,车里有has-a零件,这就是组合,宝马奔驰是车的一种,具有车的功能,宝马奔驰是is-a车。我这么理解组合继承对不
回复 使用道具 举报
面向对象编程讲究的是代码复用,继承和组合都是代码复用的有效方法。组合是将其他类的对象作为成员使用,继承是子类可以使用父类的成员方法。引用一个生动的比方:继承是说“我父亲在家里给我帮了很大的忙”,组合是说“我请了个老头在我家里干活”。
继承

在继承结构中,父类的内部细节对于子类是可见的。所以我们通常也可以说通过继承的代码复用是一种“白盒式代码复用”。

优点:

简单易用,使用语法关键字即可轻易实现。
易于修改或扩展那些父类被子类复用的实现。
缺点:

编译阶段静态决定了层次结构,不能在运行期间进行改变。
破坏了封装性,由于“白盒”复用,父类的内部细节对于子类而言通常是可见的。
子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性。当父类的实现更改时,子类也不得不会随之更改。
组合

组合是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能。因为在对象之间,各自的内部细节是不可见的,所以我们也说这种方式的代码复用是“黑盒式代码复用”。

优点:

通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。
“黑盒”复用,被包含对象的内部细节对外是不可见。不破坏封装,整体类与局部类之间松耦合,彼此相对独立。
整体类对局部类进行包装,封装局部类的接口,提供新的接口,具有较好的可扩展性。
缺点:

整体类不能自动获得和局部类同样的接口,比继承实现需要的代码更多。
不熟悉的代码的话,不易读懂。
两者的选择

is-a关系用继承表达,has-a关系用组合表达。继承体现的是一种专门化的概念而组合则是一种组装的概念。

个人推荐:除非用到向上转型,不然优先考虑组合。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 itheima01 于 2013-4-4 22:02 编辑

百度的我也看了。但是就是不理解,想用自己的话来表达一下  比如
class DianNao
{
   String color;
   void xianShi()
  {}
  void  shengYin()
  {}
}
class Car
{
   String color;
   void run(DianNao dn)
  {
     this.color=dn.color;
      dn.shengYin();//是不是可以调用dn的所有方法
      //如果想调用 dn的xianShi方法,怎么实现覆写和重载。
     //还是在这个方法下面重新写个void xianShi(){}; 如下;;
     
  }
   void xianShi()
   {}
}
是不是只有在main方法中实例dn以后才能让run方法实现。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
如果仍有问题,请继续追问,如果问题已解决,请将分类改为已解决,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马