精华内容
下载资源
问答
  • 我发现这个问题很难回答,因为答案可能不会让面试官满意,在...这是非常经典的问题,与为什么 String 在 Java 中是可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。 为什...

    我发现这个问题很难回答,因为答案可能不会让面试官满意,在大多数情况下,面试官正在寻找答案中的关键点,如果你提到这些关键点,面试官会很高兴。

     

    在 Java 中回答这种棘手问题的关键是准备好相关主题, 以应对后续的各种可能的问题。

    这是非常经典的问题,与为什么 String 在 Java 中是不可变的很类似; 这两个问题之间的相似之处在于它们主要是由 Java 创作者的设计决策使然。

    为什么Java不支持类多重继承, 可以考虑以下两点:

    1、 第一个原因围绕钻石💎形继承问题产生的歧义

    考虑一个类 A 有 foo() 方法, 然后 B 和 C 派生自 A, 并且有自己的 foo() 实现,现在 D 类使用多个继承派生自 B 和 C。

    如果我们只引用 foo(), 编译器将无法决定它应该调用哪个 foo(),这也称为 Diamond 问题,因为这个继承方案的结构类似于菱形,见下图:

                    A foo()      
                   / \      
                 /     \      
     foo() B     C foo()      
                 \     /      
                   \ /      
                   D  foo()  
    

    即使我们删除钻石的顶部 A 类并允许多重继承,我们也将看到这个问题含糊性的一面。如果你把这个理由告诉面试官,他会问为什么 C++ 可以支持多重继承而 Java不行。

    嗯,在这种情况下,我会试着向他解释我下面给出的第二个原因,它不是因为技术难度, 而是更多的可维护和更清晰的设计是驱动因素, 虽然这只能由 Java 言语设计师确认,我们只是推测。

    维基百科链接有一些很好的解释,说明在使用多重继承时,由于钻石问题,不同的语言地址问题是如何产生的。

    2、对我来说第二个也是更有说服力的理由是,多重继承确实使设计复杂化并在强制转换、构造函数链接等过程中产生问题。

    假设你需要多重继承的情况并不多,简单起见,明智的决定是省略它。

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


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

    千次阅读 2013-11-27 08:42:42
    James Gosling在1995年2月发表了一篇名”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。 Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)...
    本文由 ImportNew - 唐小娟 翻译自 Javapapers。如需转载本文,请先参见文章末尾处的转载要求。

    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
    转载请保留原文出处、译者、译文链接和上面的微信二维码图片。]

    展开全文
  • 什么是钻石问题?...如果java要解决这个问题,需要引入更复杂的机制,这和java 的初衷是背道而驰的(simple),但是java中可以实现多个接口,这与多重继承是非常相似的。 转载于:https://www.cnblogs....

    什么是钻石问题?如下图所示,B和C继承于A,D继承B和C(多重继承),在D中调用A的方法时,无法判断是调用B中的实现还是C的实现,下图继承关系是个菱形,所以该问题又叫做菱形问题。

    如果java要解决这个问题,需要引入更复杂的机制,这和java 的初衷是背道而驰的(simple),但是java中可以实现多个接口,这与多重继承是非常相似的。

     

    转载于:https://www.cnblogs.com/cruze/p/3727090.html

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

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

    千次阅读 2019-06-22 14:57:22
    熟悉 Java 的小伙伴应该知道 Java 有个很重要的特性就是它不支持多重继承。但是使用过其他面向对象编程语言的童鞋会知道,有的语言是支持多重继承的,比如 C++,Python. 我们来看看 ”Java 之父“:James Gosling ...
  • Java语言(非JVM)对于方法重载(Overload)的判断仅限于参数列表,即如果需要重载方法,它的参数列表必须不同,能以方法名和参数相同而返回值(或抛出的异常)不同的方式重载方法。可以通过反射机制验证这一点,即我们...
  • 我发现这个Java核心问题很难回答,因为你的答案可能...这是非常经典的问题,与为什么String在Java中是可变的很类似;这两个问题之间的相似之处在于它们主要是由Java创作者的设计决策使然。常见java面试题,还在为...
  • 为什么 Java 不支持多重继承

    千次阅读 2020-07-02 16:51:31
    作者:Yujiaao ... 我发现这个问题很难回答,因为答案可能不会让面试官满意,在大多数情况下,面试官正在寻找答案中的关键点,如果你提到这些关键点,面试官会很高兴。 在 Java 中回答这种棘手问题的关键...为什么Java...
  • 那么多重继承为什么会被错用呢?或者说是多重继承容易出现什么问题?我们来看一下下面这个比较著名的 “ 多重继承的钻石问题 ” 我们假设类 A、B、C 内的方法都是 public 的,以方便讨论。 类 B 和类 C 继承自类...
  • 前言:我为什么要用这个问题单独发一篇文章呢?因为我发现这个问题很难回答,因为答对,和答好完全是两个结果。我相信大家面试的时候很清楚答对和答好差距在哪里。因为答案可能不会让面试官满意,在大多数情况下,...
  • 专注于Java领域优质技术,欢迎关注来自:http://t.cn/AiYubGi1我发现这个问题很难回答,因为答案可能不会让面试官满意,在...这是非常经典的问题,与为什么 String 在 Java 中是可变的很类似; 这两个问题之间...
  • 学习Java语言的一开始,就被任何一本教科书告知,Java语言是不支持多重继承的。但是可以利用接口完成多重实现。于是这个“事实”就作为一条常识,神一样的存在了。 Why can not? 当被问及这条神律啥在Java语言...
  • 点击上方“Java基基”,选择“设星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解...
  • 为什么要用这个问题单独发一篇文章呢?因为我发现这个问题很难回答,因为答对,和答好完全是两个结果。我相信大家面试的时候很清楚答对和答好差距在哪里。因为答案可能不会让面试官满意,在大多数情况下,面试官...
  • 没想过面试的时候,会遇到语言设计上的问题。...假设D通过多重继承继承了B和C,那么D应该继承B和C的重载方法,那么它应该继承哪个的呢? 2. 多种继承会使系统设计更加复杂且难以维护。 3. Java里的...
  • 概述多重继承是面向对象概念的一个特性,其中一个类...java不支持类的多继承,但是可以通过接口或内部类来曲线实现多继承。为什么不支持多继承请看下面的代码,它将编译报错:public class MultiInheritTest {@Te...
  • 在标题为“Java:概述”由James Gosling在1995年2月的白皮书,给出了一个想法,为什么Java不支持继承。 JAVA省略了许多很少用到,缺乏了解,混淆功能的C + +,在我们的经验中带来更多的悲伤大于收益。这主要...
  • 概述 多重继承是面向对象概念的一个特性,其中一个类可以...java不支持类的多继承,但是可以通过接口或内部类来曲线实现多继承。 为什么不支持多继承 请看下面的代码,它将编译报错: public class MultiInheritTest...
  • James Gosling在1995年2月发表了一篇名”Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。 Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)(尽管...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 142
精华内容 56
关键字:

为什么java不支持多重继承

java 订阅