为什么Java不支持多重继承 - Sanarous的博客

为什么Java不支持多重继承

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

其实这是在我去年去华为实习面试的时候面试官问过我的问题,但是当时并没有回答上来,当时只是谈及到Java和C++区别的时候说了一句Java不支持多重继承,但是背后我并没有去实际了解为什么不支持的原因(后来一直不断反思自己,基本知识点一定要扎实)。虽然面试后查了资料知道了原因,但是一直没有记录下来。今天写个随笔记录一下这个原因。

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

Java白皮书

Java不支持多重继承

首先我们需要搞清楚,Java本身是不支持多重继承的,那么有人就会问,Java可以实现多个接口不就是支持多重继承吗?实际上稍微懂一些Java语法就知道,接口跟继承具有本质的不同。

接口对类来说,实际上是给类赋予了更多的灵活性,一个类可以实现多个接口,从语法层面来看就是给这个类添加一些属性和行为,这跟继承是从父类中获取属性和行为是完全不同的。

为什么不支持多重继承

简单来说当然是因为Java的作者的决定了,但是作者在决定这么做的时候,肯定也不是一拍脑门就决定Java这门语言就得去掉多重继承,Java之父们肯定也是经过各种权衡考虑之后才做此决定。而我们分享一下James Gosling对于Java的定义。

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

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

Java在设计之初确实为了语言上的简单做了不少功夫,比如去掉了指针,GC的存在避免了需要手动清理内存等等问题。

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

什么是菱形问题?

就是如上图所示,如果B和C都继承自A,并且同时都覆盖掉A中的某个方法,然后D又继承自B和C,那么在D中调用这个方法的时候,就无法判断调用的是B中的实现还是C中的实现。这种继承关系是一种菱形,所以就叫做菱形问题。

如果Java要解决这种问题,那么就需要去引入更复杂的机制,这和作者的初衷(Java is a simple language )是背道而驰的。C++就经常会掉入这种陷阱,所以为了避免这种问题,Java之父们就决定去掉多重继承,并设计了接口这种概念来折中处理一个类需要多种实现方式的方法。

如果这篇文章对您很有帮助,不妨
-------------    本文结束  感谢您的阅读    -------------
0%