精华内容
下载资源
问答
  • 原标题:为什么 Java 不支持多重继承来源:ImportNew - 唐小娟,James Gosling在1995年2月发表了一篇名为”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。Java去除了一些C++中很少用、而且被经常...

    原标题:为什么 Java 不支持多重继承

    来源:ImportNew - 唐小娟,

    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之父的原话吧。

    9ecc1dc60347c112d502e96c352689ee.png

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

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

    多重继承

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

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

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

    简单

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

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

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

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

    9f1aab9edb3daf641c7e85fad97ffaf9.png

    多重继承的钻石问题

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

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

    很少使用

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

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

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

    责任编辑:

    展开全文
  • 熟悉 Java 的小伙伴应该知道 Java 有个很重要的特性就是它不支持多重继承。但是使用过其他面向对象编程语言的童鞋会知道,有的语言是支持多重继承的,比如 C++,Python.我们来看看 ”Java 之父“:James Gosling ...

    熟悉 Java 的小伙伴应该知道 Java 有个很重要的特性就是它不支持多重继承。但是使用过其他面向对象编程语言的童鞋会知道,有的语言是支持多重继承的,比如 C++,Python.

    我们来看看 ”Java 之父“:James Gosling 老爷子说过的这样一句话。

    JAVA omits many rarely used, poorly understood, confusing features of C++ that in our experience bring more grief than benefit. This primarily consists of operator overloading (although it does have method overloading), multiple inheritance, and extensive automatic coercions.

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

    那么多重继承为什么会被错用呢?或者说是多重继承容易出现什么问题?我们来看一下下面这个比较著名的 “ 多重继承的钻石问题 ”

    d3cde675e0738533b3316b838b224231.png

    我们假设类 A、B、C 内的方法都是 public 的,以方便讨论。

    类 B 和类 C 继承自类 A,且都重写了类 A 中的同一个方法,而类 D 同时继承了类 B 和类 C,那么此时类 D 会继承 B、C 的方法,那对于 B、C 重写的 A 中的方法,类 D 会继承哪一个呢?

    看到这里,相信大家也明白了多重继承会导致这种有歧义的情况存在。

    在 C++ 和 Python 中又称这种情况为二义性,对此 C++ 的解决办法是在调用前指定类名,或者使用同名覆盖。而 Python 也是需要指明需要使用的是哪个父类的方法。并且其实,这两种语言在支持多重继承这个角度上也都建议要把这种多个父类中的出现同名方法的情况给尽量避免掉。

    所以考虑到这种二义性问题,Java 不支持多重继承。

    但是 Java 支持多接口实现,现在,我们想一想,多接口实现为何就不会存在二义性问题?

    很简单,因为接口中的方法,是抽象的(从JDK1.8之后,接口中允许给出一些默认方法的实现,这里不考虑这个),就算一个类实现了多个接口,且这些接口中存在某个同名方法,但是我们要清楚的知道,这个同名方法最终需要由这个类自己来实现,所以并不会出现二义性的问题。

    但是有的小朋友就会问了,不同接口中定义了相同的方法不会造成二义性的问题,但是接口允许定义 public static 的变量啊,那如果变量名一样,不也是会有二义性问题吗?

    我们来自己验证一下这个问题,定义两个接口,两个接口中都声明一个叫做 num 的整型变量。

    package InnerClass;

    public interface Inter1 {

    public static final int num = 1;

    }

    package InnerClass;

    public interface Inter2 {

    public static final int num = 2;

    }

    后声明一个测试类 test 去实现这两个接口,且在该测试类的 main 方法中,访问这个 num。

    package InnerClass;

    public class Test implements Inter1,Inter2{

    public static void main(String[] args) {

    System.out.println(num);

    }

    }

    我们执行一下编译。

    969c0ac3222f641e941ccec24193857f.png

    编译都无法通过。。。所以说 Java 的多接口实现避免了二义性问题。而如果你就想要多重继承,多接口实现满足不了你的话,那么你可以采用内部类的方式来设计你的程序,它在一定程度上弥补了 Java 的不支持多继承的缺陷(这是我在看《Thinking in Java》这本书中讲内部类时作者说的,当然我到现在也想不明白,什么场景下就非得用多重继承,多接口实现就不行?)

    ————————————————

    原文链接:https://blog.csdn.net/u013568373/java/article/details/93317194

    展开全文
  • 1.第一个原因是围绕钻石形继承问题产生的歧义,考虑一个类 A 有 foo() 方法, ...这也称为 Diamond 问题,因为这个继承方案的结构类似于菱形,即使我们删除钻石的顶部 A 类并允许多重继承,我们也将看到这个问题含...

    1.

    第一个原因是围绕钻石形继承问题产生的歧义,考虑一个类 A 有 foo() 方法, 然后 B 和 C 派生自 A, 并且有自己的 foo() 实现,现在 D 类使用多个继承派生自 B 和C,如果我们只引用 foo(), 编译器将无法决定它应该调用哪个 foo()。这也称为 Diamond 问题,因为这个继承方案的结构类似于菱形,即使我们删除钻石的顶部 A 类并允许多重继承,我们也将看到这个问题含糊性的一面。

    2.

    如果你把这个理由告诉面试官,他会问为什么 C++ 可以支持多重继承而 Java不行。嗯,在这种情况下,我会试着向他解释我下面给出的第二个原因,它不是因为技术难度, 而是更多的可维护和更清晰的设计是驱动因素, 虽然这只能由 Java 言语设计师确认,我们只是推测。维基百科链接有一些很好的解释,说明在使用多重继承时,由于钻石问题,不同的语言地址问题是如何产生的。见下图:

    A foo()

    /

    /

    foo() B C foo()

    /

    /

    D foo()

    多重继承确实使设计复杂化并在转换、构造函数链接等过程中产生问题。假设你需要多重继承的情况并不多,简单起见,明智的决定是省略它。此外,Java 可以通过使用接口支持单继承来避免这种歧义。由于接口只有方法声明而且没有提供任何实现,因此只有一个特定方法的实现,因此不会有任何歧义。

    展开全文
  • 为什么Java不支持多重继承

    千次阅读 2013-06-09 09:23:10
    James Gosling在1995年2月发表了一篇名为”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。 Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)(尽管...

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


    展开全文
  • 首先我们将了解什么是继承?...什么是多重继承?继承是适用于大多数编程语言的概念。当A类可以由B类扩展并且B类可以由C类扩展时。语法interfaceA{publicvoida(){}}interfaceBextendsA{publicvoida(){}}classCimpl...
  • 为什么Java不支持多重继承?

    千次阅读 2013-11-27 08:42:42
    James Gosling在1995年2月发表了一篇名为”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。 Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)...
  • 我发现这个问题很难回答,因为答案可能不会让面试官满意,在...这是非常经典的问题,与为什么 String 在 Java 中是可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。 为什...
  • 什么是钻石问题?...如果java要解决这个问题,需要引入更复杂的机制,这和java 的初衷是背道而驰的(simple),但是java中可以实现多个接口,这与多重继承是非常相似的。 转载于:https://www.cnblogs....
  • 【填空题】Java中每个类的定义由类头和类体两部分组成,其中类体部分包括 和 。 (5.0分)【单选题】病人男性,64岁,手术后第三天,护士通过评估认为目前存在以下问题属于首有问题的是【判断题】Java语言中,所创建的子类...
  • Java语言不支持多重继承-Read接口 和 内部类 接口 对象克隆 内部类 一、Java语言的接口 1.什么是接口?为什么要设置接口? Java语言的接口是用来实现类间多重继承功能的 结构。它定义了若干个抽象方法和常量用以实现...
  • 个人简介:荡不羁,一生所爱。**Java耕耘者(微信公众号ID:Java耕耘者)**,欢迎关注。...为什么Java不支持多重继承, 可以考虑以下两点:第一个原因围绕钻石????形继承问题产生的歧义,考虑一个类 A ...
  • Java 程序实现多重继承在此示例中,我们...但是,Java不支持多重继承。要在Java中实现多重继承,我们必须使用接口。示例:Java中的多重继承示例interfaceBackend{//抽象类publicvoidconnectServer();}classFrontend...
  • Java - 为什么Java不支持多重继承

    万次阅读 2019-08-13 11:28:44
    为什么Java不支持多重继承,可以考虑以下两点: 1.第一个原因是围绕钻石GEM形继承问题产生的歧义。考虑一个类A有foo()方法,然后B和C派生自A,并且有自己的foo()实现,现在D类使用多个继承派生自B和C,如果我们只...
  • 我发现这个 Java 核心问题很难回答,因为你的答案可能不会让面试官...这是非常经典的问题,与为什么 String 在 Java 中是可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。为...
  • 我发现这个问题很难回答,因为答案可能不会让面试官满意,在大多数情况下,面试官正在寻找答案中的关键点,如果你提到这些关键点,面试官会很高兴。在 Java 中回答这种棘手问题的关键是准备好...为什么Java不支持类...
  • Java语言(非JVM)对于方法重载(Overload)的判断仅限于参数列表,即如果需要重载方法,它的参数列表必须不同,能以方法名和参数相同而返回值(或抛出的异常)不同的方式重载方法。可以通过反射机制验证这一点,即我们...
  • Java语言(非JVM)对于方法重载(Overload)的判断仅限于参数列表,即如果需要重载方法,它的参数列表必须不同,能以方法名和参数相同而返回值(或抛出的异常)不同的方式重载方法。可以通过反射机制验证这一点,即我们...
  • 摘要:正下列确哪种说法,只支重继重继关于肝性脑病。支的周期(。只支重继重继可修改专用主动承载以由发起。...正下列确哪种说法,只支重继重继关于肝性脑病。持单承持多承寻呼E中关于的是错误说法。支的...
  • Java为什么不支持多重继承

    千次阅读 2019-06-22 14:57:22
    熟悉 Java 的小伙伴应该知道 Java 有个很重要的特性就是它不支持多重继承。但是使用过其他面向对象编程语言的童鞋会知道,有的语言是支持多重继承的,比如 C++,Python. 我们来看看 ”Java 之父“:James Gosling ...
  • 1.简要介绍java程序的健壮性。...(其实我觉得它不是完全面向对象的)答:因为它不支持任何面向过程的程序设计技术它的所有程序设计技术都是用类来实现的。另答:因为它有8种简单数据类型不是面向对象的,可以直接使...
  • 我发现这个Java核心问题很难回答,因为你的答案可能...这是非常经典的问题,与为什么String在Java中是可变的很类似;这两个问题之间的相似之处在于它们主要是由Java创作者的设计决策使然。常见java面试题,还在为...
  • java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章。 在这篇文章中,我们将研究多重继承,然后... Java不支持类中的多重继承,因为它可能导致钻石问题,而不是提供一些复杂的方法来解决它,而是有更...
  • 多重继承java 有时我写了几篇有关Java 继承 , 接口和组成的文章。 在这篇文章中,我们将研究多重继承,然后了解组成... Java不支持类中的多重继承,因为它可能导致菱形问题 ,而不是提供一些复杂的方法来解决它,...
  • 前言:我为什么要用这个问题单独发一篇文章呢?因为我发现这个问题很难回答,因为答对...在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。这是非常经典的问题,与为什么 String 在 ...
  • 那么多重继承为什么会被错用呢?或者说是多重继承容易出现什么问题?我们来看一下下面这个比较著名的 “ 多重继承的钻石问题 ” 我们假设类 A、B、C 内的方法都是 public 的,以方便讨论。 类 B 和类 C 继承自类...
  • 专注于Java领域优质技术,欢迎关注来自:http://t.cn/AiYubGi1我发现这个问题很难回答,因为答案可能不会让面试官满意,在...这是非常经典的问题,与为什么 String 在 Java 中是可变的很类似; 这两个问题之间...
  • 为什么 Java 不支持多重继承

    千次阅读 2020-07-02 16:51:31
    作者:Yujiaao ... 我发现这个问题很难回答,因为答案可能不会让...这是非常经典的问题,与为什么String 在 Java 中是可变的很类似; 这两个问题之间的相似之处在于它们主要是由Java创作者的设计决策使然。 为什么Java...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,392
精华内容 556
关键字:

java不支持多重继承

java 订阅