黑马程序员技术交流社区

标题: 为什么不支持多继承呢? [打印本页]

作者: 肖勇    时间: 2013-9-27 23:30
标题: 为什么不支持多继承呢?
因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个不能确定。

Java 支持多重继承,不支持多继承,这是两个概念。
多重继承的出现就有了 继承体系,体系中的顶层父类是通过不断向上抽取而来的。
它里面定义的该体系最基本最共性内容的功能。
所以一个体系要想被使用,直接查阅该系统中的父类的功能就可以知道该体系的最基本用法,
那么想要使用一个体系是,需要被建立对象。建议建立最子类对象,因为最子类不仅可以使用父类的
共性方法,还可以使用自己特有的方法。



作者: 蔚蓝天色    时间: 2013-9-27 23:35
其实继承在现在的实际开发中用的并不是很多,现在更多的是面向接口的开发,因为多重继承带来的高耦合性,会给后期的软件维护带来相当大的困难
作者: 欲困    时间: 2013-9-28 00:50
任何设计都要合理,一个子类不可能有两个父类,就像一个孩子不能有两个亲爹似的。而单继承具有局限性,所以设计了接口很好的解决了java单继承的局限性
作者: hanfei2511    时间: 2013-9-28 08:46
我认为如果如果java中要多继承的话,首先遇到问题的就是在构造方法里面,我们知道对于每个类缺省的构造方法的第一句是隐含的super(),如果我们要产生一个子类对象,而这个子类有多于一个的父类,那么这个super()要指向哪一个呢?第一个?随机选一个?还是有超级super()可以同时实现多个?java恐怕没有这些机制。
当然,java提供了其他机制来达到类似的目的,如接口多继承(不会存在构造函数上的问题),内部类实现继承等等。

其实在Thinking in Java里面,作者已经指出——如果确定在不需要多态(把子类转为父类)的情况下,应该优先考虑组合而不是继承。
“面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。” — Joe Armstrong(Erlang语言发明人)
我们也举一个大猩猩的例子,就是简单一些。比如有一个抽象的猩猩类,然后有一只拿着香蕉的非洲猩猩,还有一只拿着苹果的亚洲猩猩,现在我们需要一只同时拿着香蕉和苹果的猩猩,那么你怎么办?呵呵,其实结合前面Joe Armstrong的那句话,我们很容易就想到用接口实现多重继承是更好的解决方式。把主要的方法使用组合封装起来而避免多次实现接口的方法。而且可以根据问题的需求和复杂度来决定是否在顶层进行接口的实现等,这样不仅可以实现java低耦合,高内聚的特性,我想对内存的管理也是一中有效的方式。既然这些方法可以解决类的多继承问题,而且方便高效,何乐而不为呢?
不知见解是否准确,望同僚提意见,谢谢。





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