请问
class abc{
...
}
class def{
  ...
  public abc test(){
   }
}

class def extends abc{
  ...
  public test(){
   }
}
有什么区别?他们各自是什么用途?实现什么样的功能?
还有就是
函数调用的时候
class def {
  ...
  public test(){
   }
}abc t = new def();
这样调用使t有了什么不同于
abc t = new abc();
的属性???
我知道问题很初级,劳烦各位大师细心讲解。多谢多谢!!!

解决方案 »

  1.   

    1,一个是继承,一个是组合。
       is-a 关系用继承来表达;has-a关系用组合来表达2,abc t = new def();属向上转型
      

  2.   

    is-a 关系:圆is-a(是一种)形状,三角is-a(是一种)形状
    has-a 关系:汽车has-a 轮子,计算机has-a主板你把上面例子里的is-a和has-a两边的东西看作是class就好理解了
      

  3.   

    abc t = new def();
    这样调用使t有了什么不同于
    abc t = new abc();
    的属性???
    =============
    前面的t的t.test方法调用的是在def中定义的test()
    后一个t的t.test方法调用的是在abc中定义的test()
      

  4.   

    那为什么还要写成abc t = new def();呢?
    直接写成def t = new def();不就行了。一定是有区别,而且我觉得是让t有了abc的属性。
      

  5.   

    那为什么还要写成abc t = new def();呢?直接写成def t = new def();不就行了。
    =============================
    单独来看这句话实在没什么用,也没什么必要。
    代码中的每句话都是有上下文,你这里没什么上下文,讨论起来也没什么意义。可以假设有个方法是
    void f(abc x){
    ...
    }
    这个时候你就可以直接调用f(t)了
    当然,如果你写成def t = new def();通过f((abc)t)调用也是可以的。
    你如果是从某本书上摘录的上述代码段,那他一定是像说明向上转型这个问题,或者说多态性这个问题。
    接着上面的,如果我abc派生出来有n个类,我没必要给这个n个类挨个构造以这n个类本身为参数的f()方法,只需要一个以基类为参数的方法就足够了。
    一定是有区别,而且我觉得是让t有了abc的属性。
    =====================================
    t是指向你new出来的def对象的引用,而def由abc派生而来,t当然有abc的属性啦。即使是写成def t = new def();t也是有abc的属性的。
      

  6.   

    多谢指教,很透彻。不过有一点就是你说得:t是指向你new出来的def对象的引用,而def由abc派生而来,t当然有abc的属性啦。即使是写成def t = new def();t也是有abc的属性的。你应该好好看看我的代码。我在说到这个问题的时候重写了def的代码。
    class def {
      ...
      public test(){
       }
    }abc t = new def();
    这样还和你说的一样吗?如果不同你可以给我讲讲不同吗?
      

  7.   

    t是指向你new出来的def对象的引用,而def由abc派生而来,t当然有abc的属性啦。即使是写成def t = new def();t也是有abc的属性的。
    =================
    可能是我们对你说的“属性”这个词理解有偏差吧。我理解的这个属性没有细化到你说的方法上去。
    例如:圆类继承了形状类,我在圆类里覆盖了形状的paint方法,但我说圆有形状的属性应该没错吧?不过这个不重要,如果按照你说的属性(指你定义的abc类中的方法和def类中的方法)来,abc t = new def();后,t里面是没有abc的属性的。abc t = new def();   
    相当于
    def d=new def();
    abc t=(abc)d;