为什么Java不支持多重继承?

James Gosling在1995年2月发表了一篇名为”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。

Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)(尽管Java仍旧保留方法的重载),多重继承(multiple inheritance),以及广泛的自动强迫同型(extensive automatic coercions)。

没有谁比James Gosling更有资格来谈论这个这个话题了。这篇文章将为你介绍他对于Java不支持多重继承的看法。

Java不支持多重继承

首先我们要搞清楚,Java是否支持多重继承。有的人会说,Java中因为一个类可以实现多个接口,所以支持多重继承。错!Java不支持多重继承。如果你不相信我说的,那么再回到上面,重新读读Java之父的原话吧。

对于Java通过接口来实现多重继承的这个错误观点是有的程序员胡编乱造的。接口相对于具体的类赋予了我们更多的灵活性。我们可以一个类实现多个接口。这是约定俗成的,我们可以用两个’框架蓝图’来创造一个类。

我们做的只是实现多重接口,这里我们不是扩展(继续)什么类,而是实现一个类,在其中添加一些属性和行为。这不是从父类中直接获得一些行为和属性。在这里,我再次强调,Java不支持多重继承。

多重继承

多重继承是一个子类从多个父类中继承属性和方法。C++, Common Lisp是时下支持多重继承的流行语言。

为什么Java不支持多重继承?

现在我们清楚了Java不支持多重继承了,那么Java为什么要这么做呢?这是Java创造者们的决定,最好的理由是因为简单,以及我们很少会用到它。

简单

我想在这里分享一下James Gosling对于Java的定义。

Java: 一种简单的,面向对象的,分布式的,解释型的(译者注:Java既不是纯解释型也不是纯编译型的语言),健壮的,安全的,架构中立的,可移植的,高性能的,支持多线程的,动态语言。

看看定义的美妙之处吧。现代程序语言应该有这样的特性。我们看到,定义第一个特性是什么?是简单。

为了强化简单这个特点,这就是我们去除多重继承的原因。下面来看个例子,多重继承的菱形继承问题

多重继承的钻石问题

多重继承的钻石问题

有两个类B和C继承自A。假设B和C都继承了A的方法并且进行了覆盖,编写了自己的实现。假设D通过多重继承继承了B和C,那么D应该继承B和C的重载方法,那么它应该继承哪个的呢?是B的还是C的呢?

C++中经常会掉入这个陷阱,虽然它也提出了替代的方法来解决这个问题。我们在Java中就不会出现这个问题。就算两个接口拥有同样的方法,实现的类只会有一个方法,这个方法由实现的类编写。动态的加载类会让多重继承的实现变得困难。

很少使用

我们使用Java已经很长时间了,我们有多少次因为缺少多重继承而面临困难呢?我个人的经验是一次都没有。因为多重继承很少有机会被用到,所以更安全的做法是去掉它而保持简单性。

就算是碰到需要多重继承的情景,我们也可以找到替代方法。

我的观点是,去掉对多重继承的支持不是Java的缺陷,对开发者来说是件好事。

原文链接: Javapapers 翻译: ImportNew.com - 唐小娟
译文链接: http://www.importnew.com/4604.html
[ 转载请保留原文出处、译者和译文链接。]

关于作者: 唐小娟

一名在路上的程旭媛

查看唐小娟的更多文章 >>



相关文章

发表评论

Comment form

(*) 表示必填项

2 条评论

  1. 崔钢 说道:

    我不这么认为。对于程序设计者来说,多重继承其实很重要。我认为合理的开发方式是由资深人员设计框架,尽可能的把程序的行为和对数据的处理分离,并把他们集中在一个地方,然后由普通或者初级的程序员来填写代码。为了让这个抽象的集中变的尽可能的可控,就必须使用全部的抽象手段,这个时候,多重继承就很有力。不过我倾向与把多重继承称为混入,这样更合适一些。

    Thumb up 2 Thumb down 4

  2. tao 说道:

    支持简单的设计,反对初级实现+搞基程序员设计的理论,谁又能知道知道你哪方面高级,哪方面初级,什么时候做事高级,什么时候又做事初级。总之,你就算被叫做搞基,也是不能保证不犯楼主文中的错误的。所以宁可寄希望与程序语言的错误防范更可控。

    Thumb up 0 Thumb down 0

跳到底部
返回顶部