A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© xinchenglong 中级黑马   /  2013-8-26 22:27  /  1477 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个类可以实现多个接口,但只能继承一个抽象类?这句话改怎么理解? 在抽象类中声明的抽象方法,用派生类继承的时候,为什么要全部覆写其中的方法呢?

4 个回复

倒序浏览
本帖最后由 相许。 于 2013-8-26 22:46 编辑

抽象类里面可以有非抽象方法,但接口里只能有抽象方法.接口是可以多继承的,抽象类是某个对象的抽象,是为了扩展,接口是一个规范。抽象类用于继承,表示的是is-a的关系,而接口用于实现,表示like-a的关系
回复 使用道具 举报 1 0
一个类可以实现多个接口,但只能继承一个抽象类?这句话改怎么理解?

答:继承和接口的概念和基本定义就是这样的,属于死记硬背的东西,至于怎么理解,你可以这么想:

继承是子类继承父类的关系,一个孩子可以有几个爸爸?肯定是一个,所以子类只能继承一个抽象类;而一个爸爸能有几个孩子?可以是多个(这里暂不考虑计划生育,只是举例理解),所以一个类可以被多个类继承。

既然我们说了一个子类只能继承一个父类,那么如果我想让一个类继承多个类,免去多次重复的编写,怎么办呢?接口的概念就可以引出来了:

接口就是一种实现多继承的方法,这里我们不再用父子关系比喻了(要是你追问为什么,那我只能告诉你因为他们使用了不同的关键字extends和implements),接口相当于一个漏斗,它固定了漏斗下端的大小,起到一个限制过滤作用,让继承它的类必须符合它的大小才能通过,也就是继承类具有了接口的形态。我们假设一个类A能通过这个接口A,那这个类A是不是通过漏斗下端比这个接口A还要大的接口B、接口C、接口D...都是可以的?所以一个类能实现多个接口。


在抽象类中声明的抽象方法,用派生类继承的时候,为什么要全部覆写其中的方法呢?

答:一个儿子继承一个父亲的容貌,他们会很像,但是绝对不会一定相同,否则就成了一个人了不是么?同样的,一个类A继承另一个类B,B的抽象方法,就是为了让A重写,如果你不重写,相当于连续两次编写一样的方法、对象,最后成为一样的类,那就没有意义了。

评分

参与人数 1技术分 +1 收起 理由
赵宗荣 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 斗胆潇洒 于 2013-8-27 00:45 编辑

1、一个类可以实现多个接口,但只能继承一个抽象类。

解析:java中对于类间关系要求只能单继承,抽象类也是类,也得遵循。单继承简单说就是,一个儿子不能有两个父亲,是横向来说的。
有A,B,C三个类,A继承B又继承C就不行。如果A继承了一个抽象类,就不能再继承了。语句 class A extends B,C 就是错的。
接口却可以多实现,也就是若B,C为接口,那么可以有class A implements B,C。多实现弥补下单继承。

2、在抽象类中声明的抽象方法,用派生类继承的时候,为什么要全部覆写其中的方法呢?

解析:简单了说,只有声明,没有实现体的抽象方法,也就是没有{}和里面的东西,不复写木有意义。
抽象类的抽象方法,即abstract的方法,就是只有声明木有实现的方法,如果不在子类中覆盖,给该抽象方法实现体,那么这抽象方法,就木有意义了。所以要覆盖抽象类的抽象方法。

而为什么子类要全部复写抽象方法呢?
抽象方法虽然没有实体,但已声明,因继承关系,子类可以调用父类的方法,如果在抽象类中有抽象方法a()和b(),你只覆盖了a,没有复写b,那么我在new 子类对象xx后,我可以xx.a(),也可以xx.b(),但b没有实现体,却又被你调用了,调用了个木有意义的方法,这是不可取的。为了避免上述情况,java要求,除了抽象类的非抽象方法,所有抽象方法,子类都得覆盖。而接口就全是抽象方法了,你一实现接口,那都得复写。
回复 使用道具 举报
这没什么好说的,这就是C#的语法规范,接口就是多继承,抽象类的派生类必须override所有抽象方法,要不然抽象方法是没有意义的!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马