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的缺陷,对开发者来说是件好事。


更多相关文章

  1. Java 抽象类与接口的区别
  2. 使用 ThreadLocal 变量的时机和方法
  3. clone 方法是如何工作的
  4. Swagger 自动生成 Dubbo 服务的接口文档,以及测试调用
  5. VS中scanf等函数报错解决方法
  6. 为什么我们要面向接口编程?!
  7. jQuery编程基础精华02(属性、表单过滤器,元素的each,表单选择器,子元
  8. jQuery的$.getJSON方法在IE浏览器下失效的解决方案
  9. JavaScript / jQuery:如何链接使用console.log()的方法

随机推荐

  1. 安装Android 时 SDK AVD MANAGER时更新报
  2. [Android]Awind.inc系列android软件破解
  3. Android 问题汇总
  4. 自动换行
  5. Android 代码改变图片颜色android:tint="
  6. Android中让View匀速旋转
  7. Android 底部导航栏中间凸起、越界显示
  8. Android 默认水波纹的使用和去除
  9. android开发之android:padding和android:
  10. EditText 文字验证