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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 权跃杰 中级黑马   /  2012-7-27 09:55  /  2224 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大?

7 个回复

倒序浏览
    不是的,当创建一个子类对象时,系统会隐式地为它创建对应的父类对象, 在子类实例方法中可以通过super访问父类对象.
       所以当用继承关系来实现复用时,系统创建子类对象时,系统会隐式地创建与之对应的父类对象; 采用组合关系来实现复用,是程序员来手动创建被嵌入类的对象,它的系统开销不会有本质的差别的.
回复 使用道具 举报
1.继承和组合的概念
在新类里简单地创建原有类的对象。我们把这种方法叫作“组合”,因为新类由现有类的对象合并而成。我们只是简单地重复利用代码的功能,而不是采用它的形式。第二种方法是创建一个新类,将其作为现有类的一个“类型”。我们可以原样采取现有类的形式,并在其中加入新代码,同时不会对现有的类产生影响。这种魔术般的行为叫作“继承”(inheritance),涉及的大多数工作都是由编译器完成的。对于面向对象的程序设计,“继承”是最重要的基础概念之一。对于组合和继承这两种方法,大多数语法和行为都是类似的(因为它们都要根据现有的类型生成新类型)。
2.组合也就是一个类的对象是另外一个类的成员,一般的程序都有组合的意味,只不过是基本数据类型是成员变量.
3.继承作为面向对象的三个重要特性的一个方面,在面向对象的领域有着及其重要的作用,好像没听说哪个面向对象的语言不支持继承
4.无论还是继承,都允许我们将子对象置于自己的新类中。大家或许会奇怪两者间的差异,以及到底该如何选择。如果想利用新类内部一个现有类的特性,而不想使用它的接口,通常应选择组合。也就是说,我们可嵌入一个对象,使自己能用它实现新类的特性。但新类的用户会看到我们已定义的接口,而不是来自嵌入对象的接口。考虑到这种效果,我们需在新类里嵌入现有类的private对象。



回复 使用道具 举报
不会!
创建一个对象的时候,会自动创建相应的父类对象。可以通过super来访问
组合是手动创建被嵌入类的对象,继承是系统自动为与之对应的父类对象
所以,开销没有非常大的差别。
回复 使用道具 举报
1.在类的继承中,当我们调用子类构造器创建对象时,子类构造器总会调用父类构造器。逐层进行调用,最后首先执行的是java.lang.Object类的构造器。
2.继承和组合的对比
使用组合进行方法复用:
  1. public class Person {
  2.         public void walk() {}
  3. }

  4. class Student {
  5.         private Person a;
  6.        
  7.         public Student(Person a) {
  8.                 this.a = a;
  9.         }
  10.        
  11.         public void walk() {
  12.                 a.walk();
  13.         }
  14.        
  15.         public void learn() {}
  16. }

  17. public class test {
  18.         public static void main(String[] args) {
  19.                 Person per = new Person();
  20.                 Student stu = new Student(per);
  21.                 stu.walk();
  22.                 stu.learn();
  23.         }
  24. }
复制代码
回复 使用道具 举报
使用继承进行方法复用
  1. public class Person {
  2.         public void walk(){}
  3. }

  4. public class Student extends Person {
  5.         public void learn() {}
  6. }

  7. public class test {
  8.         public static void main(String[] args) {
  9.                 Student stu = new Student();
  10.                 stu.walk();
  11.                 stu.learn();
  12.         }
  13. }
复制代码
由于继承会自动创建父类的对象,对比以上代码可以发现,当使用组合实现复用时,只需要多一个引用变量来引用被嵌入的对象Person,所以继承和组合的系统开销不会有本质的差别。
回复 使用道具 举报
李菁 中级黑马 2012-7-27 12:34:38
7#
组合复用的原则是在一个新的对象中使用原来已经存在的一些对象使这些原来已经存在的对象成为新对象的一部分,新的对象通过向这些原来已经具有的对象委派相应的动作或命令达到复用已有功能的目的。
尽量使用对象组合,而不是继承来达到复用的目的。
回复 使用道具 举报
fiend 中级黑马 2012-7-27 22:19:49
8#
不会,组合的时候是把别的已存在的对象当作参数传进来的,所以并没有重新创建对象。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马