今天被问了。

解决方案 »

  1.   

    1、在新的class中使用既有的class,这中方法称之为"组合"。但是这种重用方式只是很单纯的重复运用以有的代码 功能,而非重复运用其形式。
    2、让新的class成为既有class的一类,并且根据需要加入新的功能,而无须更动原有class,这种方法称之为"继承"。如果B是A的一种 才用继承
      

  2.   

    IS A KINDOF BHAS A B
      

  3.   

    一个 是显式 一个 是隐式
    is a ;  has  a
      

  4.   

    楼上的都说得很形象啊补充一点吧:继承 耦合性比组合大得多。因为java又是只能单继承,这就会带来很多的极限性,特别是需要使用到多个类中的东西的时候可以用组合来代替继承。不过有时继承有时也是无可替代的,毕竟是面向对象的一个重大组成部分,在多态方面起来很大的作用。
      

  5.   

    组合和继承都允许在新的类中设置子对象(subobject),组合是显式地这样做的,而继承 
    则是隐式的。二者间的区别何在,以及怎样在二者之间做出选择。组合技术通常用于你想要在新类中使用现有类的功能而非它的接口的情形。即,你在新类中 
    嵌入某个对象,借其实现你所需要的功能,但新类的用户看到的只是你为新类所定义的接口, 
    而非嵌入对象的接口。为取得此效果,你需要在新类中嵌入一个private 的现有类的对象。有时,允许类的用户直接访问新类中的组合成份是极具意义的;也就是说,将成员对象声明 
    为public 。如果成员对象自身都实现了具体实现的隐藏,那么这种做法就是安全的。当用户 
    能够了解到你在组装一组部件时,会使得端口更加易于理解。Car 对象即为一个好例子:       //: c06:Car.java 
           // Composition with public objects. 
             
           class Engine { 
             public void start() {} 
             public void rev() {} 
             public void stop() {} 
           } 
             
           class Wheel { 
             public void inflate(int psi) {} 
           } 
             
           class Window { 
             public void rollup() {} 
             public void rolldown() {} 
           } 
             
           class Door { 
             public Window window = new Window(); 
             public void open() {} 
             public void close() {} 
           } 
             
           public class Car { 
             public Engine engine = new Engine(); 
             public Wheel[] wheel = new Wheel[4]; 
             public Door 
               left = new Door(), 
               right = new Door(); // 2-door 
             public Car() { 
               for(int i = 0; i < 4; i++) 
                 wheel[i] = new Wheel(); 
             } 
             public static void main(String[] args) { 
               Car car = new Car(); 
               car.left.window.rollup(); 
               car.wheel[0].inflate(72); 
             } 
         } ///:~由于在这个例子中Car 的组合也是问题分析的一部分(而不仅仅是底层设计的一部分),所 
    以使成员成为public 将有助于客户端程序员了解怎样去使用类,而且也降低了类开发者所面 
    临的代码复杂度。但务必要记得这仅仅是一个特例,一般情况下,你应使域(field)成为 
    private 。在继承的时候,你会使用某个现有类,并开发一个它的特殊版本。通常,这意味着你在使用 
    一个通用性(general-purpose)的类,并为了某种特殊需要而将其特殊化。略微思考一下, 
    你就会发现,用一个“交通工具”对象来构成一部“车子”是毫无意义的,因为“车子”并 
    不包含“交通工具”,它仅是一种(is-a)交通工具。其中“is-a (是一个)”的关系是用继承 
    来表达的,而“has-a        (有一个)”的关系则是用组合来表达的。
      

  6.   


    private 类型绝对只能在本类中直接使用 至于一些间接使用的除外(用的比较少嘛)
      

  7.   

    感谢22楼的肯定,我自认为,我的贴子都比较幼稚。
    我觉得学习就是向一切人学习,善于思考。勇于承认不足。
    我很笨,是驽马但我不会放弃。因为JAVA形似于我的生命。
      

  8.   

    楼上的诸多见解 多多受益 多谢 请问javaSE中包含和引用的主要区别是什么勒 它们有共同点么
      

  9.   

    组合能用所引用对象private的东西纯属放屁!extends也同样不能继承private 的成员变量和方法private 只有class 类部才能使用。对外全部封闭,也不可以继承
    protected 可以被子类继承
    public 则可以被外部使用,又可以被子类继承.
      

  10.   

    extends 在耦合性方面 比 组合差很多。
    从设计模式上看来!
    java只支持单继承。如果你想同时继承两个类是绝对做不到的。另外。如果继承泛滥。或让一个class里面的内容变得非常的臃肿。有的方法其实并不是我们需要关注的方法。他也会继承下来!
    如果用组合就不一样了。能把已有的两个类,引用进来,可以使用我们自己比较感兴趣的方法!
    所以说能用组合尽量用组合。
    我想这个就是区别吧
      

  11.   

    谁说组合可以访问私有????倒:
    package myTemp;
    class AA{
       private int a = 3;
    }public class Composition {
       AA aa = new AA() ;
       public static void main(String args[]) {
          System.out.println((new Composition()).aa.a);  //无法访问a
       }
    }