看书的过程中始终没看明白复合和继承的区别  看来看去只看出了他们的相似点
求高手提点
拜谢!

解决方案 »

  1.   

    复合重点在于组装,继承重点在于派生.是从两个不同角度对class功能的增强.
    比如说一个小团队有开发人员类,测试人员类,那么团队类就应该是这两个类的复合.具有两个类的功能,如果什么时候需要新的功能,比如翻译,可以很方便的加入到团队里来.而继承只是对一个类的派生,像上面的例子,如果开发人员和测试人员生个孩子,这个孩子具有父母双方的能力,这就叫继承.这时如果需要加个翻译的功能,就只能再找一个翻译和这个孩子再生个孩子了.
      

  2.   

    复合 has a  继承 is a
      

  3.   

    明白了  谢啦!
    我做了一个练习 对它的初始化顺序有点不明白
    //DinnerTable.java
    class Table
    { Table()
        {System.out.println("Table");}
    }
    class TableCloth
    { TableCloth()
        {System.out.println("TableCloth");}
    }
    public class DinnerTable extends Table
    { TableCloth tc=new TableCloth();
      public static void main(String[] args)
      {DinnerTable dt =new DinnerTable();
      }
    }
    这里应该算是复合和继承都用到了
    它的执行结果是:
    E:\learning\ab\cha6\练习1>java DinnerTable
    Table
    TableCloth为什么是先执行table呢
    这里的TableCloth是不是应该算是初始化呢?  如果是初始化语句那就应该先于main里的构建式
    不是吗?
      

  4.   

    首先执行mian函数里的东西DinnerTable dt =new DinnerTable();,然后加载Table执行
    Table()
        {System.out.println("Table");}
    接着执行DinnerTable的TableCloth tc=new TableCloth();
    的初始化,然后执行DinnerTable的构造函数.
      

  5.   

    继承的初始化过程:1、从new开始,在classPath中找到与类名一致的.class文件并装入,初始化所有的static fields;
    2、判断这个类是否有父类,有则递归1,直到object为止;
    从最顶的那个类开始(一般是object)
    3、按定义的顺序初始化non-static fields;
    4、执行类的构造器(函数);
    5、下移到子类,再重复3-4;
    6、创建对象,并将reference赋值。完成!构造器的第一行就是父构造器的调用,在这个例子里面,使用的是所谓的默认构造器(无参构造器),java编译器会自动引用。可以在Table中将Table()改为Table(String anyInfo){...},看看java的编译错误提示。
      

  6.   

    这样做好原因是,java的任何一个类都创建了一个父类的实例(只不过自己不知道罢了),这样也就是为何子类能拥有父类的所有东西的原因所在。当然效率低也源于此。组合和继承的标准:需要向上转型、扩展现有功能请用继承,若只是使用现有功能,请用组合!:)
      

  7.   

    加入<<中國J2EE>>群: 7557598 有你的答案