为了账号安全,请及时绑定邮箱和手机立即绑定

为什么Java不支持多继承?

为什么Java不支持多继承?

喵啊喵啊喵 2016-09-18 19:22:12
查看完整描述

6 回答

已采纳
?
萧雁翎

TA贡献57条经验 获得超235个赞

先举一个多重继承的例子,我们定义一个动物(类)既是狗(父类1)也是猫(父类2),两个父类都有“叫”这个方法。那么当我们调用“叫”这个方法时,它就不知道是狗叫还是猫叫了,这就是多重继承的冲突。



而java对此的解决方法是,一个物体的本质只能有一个。一个动物只能是狗或只能是猫,如果你想创造一个会玩毛线球会玩激光(被激光玩?)的狗,那么只需要创造一个描述这类行为的接口(就叫玩耍吧),然后在自己的类里面实现“玩耍”接口,具体实现这些玩的行为,最终你同样会得到一个既像狗又像猫的动物。如果你想让这个动物叫起来像猫而不是狗,那么使用覆写(override)机制,子类里重新定义“叫”这个行为即可。但是无论如何,这样得到的类是绝对不会有多重继承的冲突的。

再来说说abstract class和interface的区别。

abstract class的核心在于,我知道一类物体的部分行为(和属性),但是不清楚另一部分的行为(和属性),所以我不能自己实例化。还是刚才那个例子,如果你有个abstract class叫哺乳动物,那么你可以定义他们胎生,恒定体温等共同的行为,但是具体“叫”这个行为时,你得留着让非abstract的狗和猫等等子类具体实现。

interface的核心在于,我只知道这个物体能干什么,具体是什么不需要遵从类的继承关系。比如上述的“玩耍”interface,狗有狗的玩法,猫有猫的玩法,妖魔鬼怪机器人都可以玩耍,只要你告诉我这个物体有玩耍接口,我就能让它玩起来(๑•̀ㅂ•́) ✧

所以abstract class和interface是不能互相替代的,interface不能定义(它只做了声明)共同的行为,事实上它也不能定义“非常量”的变量。而abstract class只是一种分类的抽象,它不能横跨类别来描述一类行为,它使得针对“别的分类方式”的抽象变得无法实现(所以需要接口来帮忙)。而多重继承不但会造成冲突,还让一个类变得不伦不类,看不出这个类的本质,所以java毅然舍弃掉了这个祸害。

不知题主有没有理解一些。

查看完整回答
6 反对 回复 2016-09-19
?
帅帅嗒先锋

TA贡献6条经验 获得超5个赞

我就不长篇大论了。

多继承容易引发冲突,单继承对于后续的开发容易理解,并且使得结构清晰明了。
然后为了克服单继承的弱点,java便开发了接口这个东西。代替多继承来使用。

纯手打,望采纳。

查看完整回答
1 反对 回复 2016-09-19
?
ATWJSW

TA贡献4条经验 获得超1个赞

JAVA语言在早期的设计思想是简化,易于学习和使用,放弃了C++的部分功能。但现在也越来越复杂了。

查看完整回答
1 反对 回复 2016-09-18
?
汉江怪人

TA贡献50条经验 获得超11个赞

多继承容易造成面向对象的各种问题,你想想啊,儿子继承父亲,多继承就是继承多个父亲....好多爸爸,从面向对象的逻辑问题上来看这样不好不好。 PS:不要再问为什么C++支持多继承。

查看完整回答
1 反对 回复 2016-09-18
?
小城阿哥

TA贡献89条经验 获得超59个赞

类定义属性和方法 描述某一类事物的抽象
而接口定义的是行为 并不限于任何具体意向

按照逻辑上来说 单继承更明确 一个子类就应该是其父类代表的事物中的某个更具体的类别 不应该即是这种东西又是那种东西
而从实用角度上来说 单继承易读 易维护 语义清晰 逻辑清楚

而接口则不同 接口只定义一些公共行为 比如有两个接口 一个定义了跑这个动作 另一个定义了走这个动作 人这个类就可以同时实现这两个接口所定义的行为

类对接口的implements称作实现 不能叫做继承

当然 接口可以多继承接口 因为接口只定义行为 并不包含类别的含义 不指代具体的某类事物 而且 从语义上来说 接口对接口的继承称之为扩展更为合适

查看完整回答
反对 回复 2016-09-18
?
噼喱啪啦

TA贡献392条经验 获得超170个赞

太过繁琐,改进了C++的多继承,改成只有一个父类,这样就不需要自己管理繁琐的内存分配与释放,java 虚拟机就能好好工作了

查看完整回答
反对 回复 2016-09-18
  • 6 回答
  • 0 关注
  • 1827 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信