反过来问,你如果抽象类一个方法都不定义,那要抽象类干什么?
抽象类里面定义的抽象方法(其中一种用法)就是用于定义一个现在不实现(无法实现或者不必要实现),但强制子类必须实现的方法。
举个简单的例子:
例如定义一个抽象类 Shape,它有子类Circle和Square。我们为Shape设定一个抽象方法计算面积double getArea()。
凡是Shape的子类一定要实现这个方法,因此调这个方法就可以获得面积。但是你如果要再父类里实现,显然是不可能的--你还不知道具体是什么形状呢。

解决方案 »

  1.   

    抽象类方法的定义还涉及到一个class upcast和downcast的问题。
      

  2.   

    Patrick_DK(疾风摩郎) 好像是对的,我没细看。
      

  3.   

    TO:gangyi(Raymond) 
    是不是如果抽象类中定义的抽象方法在其子类中没有实现,编译就通不过?(如果答案是肯定的,那么抽象方法还是有它的必要性,起码它可以防止子类遗漏对一些必要(重要)方法的实现。除此之外我看不出还有什么必要性。你说:“反过来问,你如果抽象类一个方法都不定义,那要抽象类干什么?”
    答:可以抽象出其子类的公共属性,避免在子类中重复定义。同时它自身有无法定义一个具体的对象。你说:“......显然是不可能的--你还不知道具体是什么形状呢”
    问:这是逻辑?难道子类中的所有方法你都在抽象类中定义了抽象方法?如果没有,那我就要用你的话说了:“......显然是不可能的--你还不知道这个方法具体要实现呢。不服~(纯属讨论,话语也许过于犀利,请误见怪!)
      

  4.   

    to: ewang_365
    “这样就在抽象类中定义一个抽象的方法算是对这个方法的一个概括”问:怎么能说是“概括”,抽象函数中的抽象方法不能有方法体呀,我想“概括”都不性呀!还是不服~
      

  5.   

    to: Iforgot
    "难道你要多做无用功吗?"
    从抽象对象继承而来的子类中如果需要用到这个抽象方法都要在子类中重新定义呀。
    既然向你说的“当然可以,只是、你要看看你的目的呀!”到底哪种是无用功?还是不服~
      

  6.   

    更正:to: ewang_365
    “这样就在抽象类中定义一个抽象的方法算是对这个方法的一个概括”问:怎么能说是“概括”,抽象类中的抽象方法不能有方法体呀,我想“概
                           ● ● ●
    括”都不性呀!还是不服~
      

  7.   

    更正:to: ewang_365
    “这样就在抽象类中定义一个抽象的方法算是对这个方法的一个概括”问:怎么能说是“概括”,抽象类中的抽象方法不能有方法体呀,我想“概
                           ● ● ●
    括”都不性呀!还是不服~
      

  8.   

    to:ewang_365
    “我举个例子给你:比如有三角型,正方形,长方形,你说他们的共同父类是什么?”答:多边型或几何图形,不能定义具体的对象,需要一个抽象类描述他们的公共属性,如:边数。我要知道的是抽象函数存在的必要性。如果你要说什么求面积的方法,请看我前面的回复。
      

  9.   

    抽象类是面向象性理论多太性的一种体现!
    还有overload,override,interface!!!!楼上说的是:
    一个shape类可以作为抽象类,
    用它可以引用circle,rectangle...,而在调用其方法时将产生下朔造型!
    这就体现了多台行!!!!!!!!
    shape s1 = new circle(..);
    shape s2 = new rectangle(..);
    s1.draw();//结果话了一个元
    s2.draw();//结果话了一个矩形
    自己慢慢分析!狠有必要的!
      

  10.   

    TO:ewang_365
    我没说不定义呀,我现在就是问直接在各个子类(3角,4角,N角)中定义求面积的方法有什么不妥呢?就是因为抽象类中的求面积的方法不能帮我解决任何问题呀。难到抽象方法存在的意义就是要说明它的子类中将要出现这个方法。那我不在子类中不实现它有怎么样呢?(比如说对于5边型我只要求它的周长即可)
      

  11.   

    谢谢各位的热心解答!也许我还没理解面向对象的精髓。下面继续...to:dickensi()流星·逐日() 
    请说说
    shape  s1 = new circle(..);
    circle s2 = new circle(..);
    s1.draw();         //结果话了一个元
    s2.draw();         //结果也是话了一个元的区别,以及shape定义的好处。
      

  12.   

    上面的就是说:如果你shape中不定义draw(),那么将在s1.draw()语句中无法划出一个圆。
      

  13.   

    shape调用的时候下蒴造型了circle,但是如果你没定义draw(),那我明明把s1赋予了一个圆,居然画不出来,岂不是不符合逻辑?