当前位置: 技术问答>java相关
在JAVA中的抽象类中有必要定义抽象方法吗?我直接在它的子类中定义并实现这个方法不一样吗?
来源: 互联网 发布时间:2015-06-02
本文导语: 小弟初学JAVA,为此迷惑中... | shape调用的时候下蒴造型了circle,但是如果你没定义draw(),那我明明把s1赋予了一个圆,居然画不出来,岂不是不符合逻辑? | 根据具体情况而...
小弟初学JAVA,为此迷惑中...
|
shape调用的时候下蒴造型了circle,但是如果你没定义draw(),那我明明把s1赋予了一个圆,居然画不出来,岂不是不符合逻辑?
|
根据具体情况而定的
如果这个方法不只一个子类会用到,那就定义在抽象类中
如果只有一个特殊子类会用到,那么就不用定义在抽象类中了
如果这个方法不只一个子类会用到,那就定义在抽象类中
如果只有一个特殊子类会用到,那么就不用定义在抽象类中了
|
反过来问,你如果抽象类一个方法都不定义,那要抽象类干什么?
抽象类里面定义的抽象方法(其中一种用法)就是用于定义一个现在不实现(无法实现或者不必要实现),但强制子类必须实现的方法。
举个简单的例子:
例如定义一个抽象类 Shape,它有子类Circle和Square。我们为Shape设定一个抽象方法计算面积double getArea()。
凡是Shape的子类一定要实现这个方法,因此调这个方法就可以获得面积。但是你如果要再父类里实现,显然是不可能的--你还不知道具体是什么形状呢。
抽象类里面定义的抽象方法(其中一种用法)就是用于定义一个现在不实现(无法实现或者不必要实现),但强制子类必须实现的方法。
举个简单的例子:
例如定义一个抽象类 Shape,它有子类Circle和Square。我们为Shape设定一个抽象方法计算面积double getArea()。
凡是Shape的子类一定要实现这个方法,因此调这个方法就可以获得面积。但是你如果要再父类里实现,显然是不可能的--你还不知道具体是什么形状呢。
|
是这样的,这个抽象的方法可能是一个名字,但是在不同的子类中的用法可能有小的差异,这样就在抽象类中定义一个抽象的方法算是对这个方法的一个概括,不同子类中实现的改抽象方法会有小的差异,但大体作用上相同.
|
抽象类中的抽象函数存在的必要性?
你要多理解理解面向对象的思想
亚洲人是黑眼珠
欧洲人是蓝眼珠(假设全是蓝的:))
那么,人是不是可以没有眼珠呢?
明白了吧
你要多理解理解面向对象的思想
亚洲人是黑眼珠
欧洲人是蓝眼珠(假设全是蓝的:))
那么,人是不是可以没有眼珠呢?
明白了吧
|
是这样的,这个抽象的方法可能是一个名字,但是在不同的子类中的用法可能有小的差异,这样就在抽象类中定义一个抽象的方法算是对这个方法的一个概括,不同子类中实现的改抽象方法会有小的差异,但大体作用上相同.
|
也就是说抽象类里面的抽象方法将子类里面的具有相同功能但实现上稍有差异的一些方法作了一个抽象,这下子应该明白了吧?
|
抽象类方法的定义还涉及到一个class upcast和downcast的问题。
|
当然可以,只是、你要看看你的目的呀!难道你要多做无用功吗?
|
Patrick_DK(疾风摩郎) 好像是对的,我没细看。
|
你看我的回答了吗??
|
我举个例子给你:比如有三角型,正方形,长方形,你说他们的共同父类是什么?
|
它的父类肯定是“形状”,但是形状里面的方法不可能把计算形状面积或周长的具体方法定义出来,因为他还没有确定是什么形状,所以只好定义成抽象的,但是如果你非要定义成非抽象的,那么你说这么多形状岂不是永远不可能有共同的父类了,那么这就违背了面向对象的原则
|
对,你说的边数是他们共同有的特征,但是你有没有想过,一个完整的类,就如你说的“多边型”必定也应当有面积的定义,要不难道说一个多边型不能有面积???但是面积又要看具体形状来定,因此在“多边型”的类里面只能对他们做个抽象的定义,也就是说只有“面积”这个方法名字,来证明“多边型”也有面积,至于怎么实现,还要看子类是什么样的多边型。
|
对,你说的边数是他们共同有的特征,但是你有没有想过,一个完整的类,就如你说的“多边型”必定也应当有面积的定义,要不难道说一个多边型不能有面积???但是面积又要看具体形状来定,因此在“多边型”的类里面只能对他们做个抽象的定义,也就是说只有“面积”这个方法名字,来证明“多边型”也有面积,至于怎么实现,还要看子类是什么样的多边型。
|
也就是说,不能因为面积无法定义而在多边形里面不定义面积这个方法。
|
抽象类是面向象性理论多太性的一种体现!
还有overload,override,interface!!!!
楼上说的是:
一个shape类可以作为抽象类,
用它可以引用circle,rectangle...,而在调用其方法时将产生下朔造型!
这就体现了多台行!!!!!!!!
shape s1 = new circle(..);
shape s2 = new rectangle(..);
s1.draw();//结果话了一个元
s2.draw();//结果话了一个矩形
自己慢慢分析!狠有必要的!
还有overload,override,interface!!!!
楼上说的是:
一个shape类可以作为抽象类,
用它可以引用circle,rectangle...,而在调用其方法时将产生下朔造型!
这就体现了多台行!!!!!!!!
shape s1 = new circle(..);
shape s2 = new rectangle(..);
s1.draw();//结果话了一个元
s2.draw();//结果话了一个矩形
自己慢慢分析!狠有必要的!
|
拜托,你考虑父类的时候不要总是局限于它的方法是为了子类继承的,你要想想父类也要有自己的方法阿.它的方法不只是为了子类继承,它的方法也表明了他自己拥有这个属性!!!
|
上面的就是说:如果你shape中不定义draw(),那么将在s1.draw()语句中无法划出一个圆。