黑马程序员技术交流社区

标题: 关于抽象类和函数覆盖的问题 [打印本页]

作者: 黑夜里的白猫    时间: 2013-5-22 15:22
标题: 关于抽象类和函数覆盖的问题
抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
        如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
而函数覆盖只需要将你要重写的方法重写就可以
为什么不直接用函数覆盖,还要有abstract这个关键字呢?  抽象类有什么优势么?

作者: 无妄无涯    时间: 2013-5-22 15:37
在面向对象的概念里,所有的对象都是通过类来描绘的,但并不是所有的类都是用来描绘对象。打个比方,你要开发PS软件,会发现存在着圆、三角、矩形等等具体概念。不难理解,这些具体概念都属于形状这一概念,但是形状显然是不存在实体的,它是一个抽象概念。这种情况就需要抽象类来描述这种不能或者不该实例化的概念。
作者: 王靖远    时间: 2013-5-22 15:46
接口是抽象类可以实现啊,弥补java中不可以多继承,但是可以多实现。也就是说一个子类可以实现几个抽象类。但是继承的话只能继承一个了。
作者: 翟宝海    时间: 2013-5-22 16:05
       抽象类体现的的就是一种模板模式的设计,是从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为其子类的模板,从而避免子类设计的随意性。
    它与子类的距离比一般父类和子类的距离要远得多,以至于抽象类在定义某些功能时,只能明确有这么一个功能,而不能定义具体的方法;
    比如从猴子、鸟、袋鼠、鱼抽象出一个动物类,这个动物类具有运动的功能,但是怎么运动却不能明确,而要由继承它的子类去具体实现:猴子爬树、鸟飞翔、袋鼠蹦跳、鱼游泳;
    而一般的子父类继承,函数覆盖就无法达到这样的效果。
    普通类继承,可以不用覆盖父类的方法,直接使用;而抽象类可以通过声明一个或几个抽象方法,强迫继承它的子类必须实现所有的抽象方法才可以建立具体的对象。
作者: ozt6719393    时间: 2013-5-22 16:07
abstract class和interface所反映出的设计理念,来分析一下二者的区别。我认为,从这个层面进行分析才能理解二者概念的本质所在。
前面已经提到过,abstarct class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。
作者: 黑夜里的白猫    时间: 2013-5-22 16:10
无妄无涯 发表于 2013-5-22 15:37
在面向对象的概念里,所有的对象都是通过类来描绘的,但并不是所有的类都是用来描绘对象。打个比方,你要开 ...

那是不是可以说函数覆盖在某方面和抽象相对,函数覆盖既可以被重写,并且他所在的类又可以实例化对象。
而抽象的话只能是被重写,而抽象类不能被实例化。。这样理解可以不?


还有就是抽象函数只有功能主体,不用写功能内容,对不?
public abstract void work();

作者: 黑夜里的白猫    时间: 2013-5-22 16:25
翟宝海 发表于 2013-5-22 16:05
抽象类体现的的就是一种模板模式的设计,是从多个具有相同特征的类中抽象出一个抽象类,以这个抽象 ...

很具体。明白了。谢谢。
作者: 无妄无涯    时间: 2013-5-22 16:25
黑夜里的白猫 发表于 2013-5-22 16:10
那是不是可以说函数覆盖在某方面和抽象相对,函数覆盖既可以被重写,并且他所在的类又可以实例化对象。
...

是的,没有理解错误。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2