精华内容
下载资源
问答
  • 原标题:为什么 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的缺陷,对开发者来说是件好事。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 我发现这个问题很难回答,因为答案可能不会让面试官满意,在...这是非常经典的问题,与为什么 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为什么不允许类多重继承却允许接口多重继承,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • Java - 为什么Java不支持多重继承

    万次阅读 2019-08-13 11:28:44
    为什么Java不支持多重继承,可以考虑以下两点: 1.第一个原因是围绕钻石GEM形继承问题产生的歧义。考虑一个类A有foo()方法,然后B和C派生自A,并且有自己的foo()实现,现在D类使用多个继承派生自B和C,如果我们只...

    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

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

    1.第一个原因是围绕钻石GEM形继承问题产生的歧义。考虑一个类A有foo()方法,然后B和C派生自A,并且有自己的foo()实现,现在D类使用多个继承派生自B和C,如果我们只引用 foo(),编译器将无法决定它应该调用哪个foo()。这也称为Diamond问题。

    那为什么C++可以支持多重继承而Java不行。嗯,在这种情况下,它不是因为技术难度,而是更多的可维护和更清晰的设计是驱动因素。

    2.对我来说第二个也是更有说服力的理由是,多重继承确实使设计复杂化并在转换、构造函数链接等过程中产生问题。假设你需要多重继承的情况并不多,简单起见,明智的决定是省略它。此外,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为什么不支持多重继承

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

    千次阅读 2013-06-09 09:23:10
    James Gosling在1995年2月发表了一篇名Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。 Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)(尽管...
  • 2.为什么java语言是完全面向对象的?(其实我觉得它不是完全面向对象的)答:因为它不支持任何面向过程的程序设计技术它的所有程序设计技术都是用类来实现的。另答:因为它有8种简单数据类型不是面向对象的,可以直接...
  • 概述多重继承是面向对象概念的一个特性,其中一个类可以继承多个父类的属性。当超类和子类中都存在具有相同签名的方法时,...为什么不支持多继承请看下面的代码,它将编译报错:public class MultiInheritTest {@Te...
  • 学习Java语言的一开始,就被任何一本教科书告知,Java语言是不支持多重继承的。但是可以利用接口完成多重实现。于是这个“事实”就作为一条常识,神一样的存在了。 Why can not? 当被问及这条神律啥在Java语言...
  • java可以多重继承吗 有时我写了几篇有关Java继承,接口和组成的文章。 在这篇文章中,我们将研究多重继承,然后... Java不支持类中的多重继承,因为它可能导致钻石问题,而不是提供一些复杂的方法来解决它,而是有更...
  • 具体为什么不可以,请继续关注我的博客~  好了,还是现在就说吧,抽象类跟普通类在多继承这块我觉得是差不多的。 看下面代码: abstract class a{ abstract void b(); void c(){ System.out.println...
  • java允许接口的多重继承

    千次阅读 2021-04-23 11:23:39
    Interface3 Extends Interface0, Interface1, interface……允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A如何决定该继承那一个呢?但接口存在这样的问题,接口全都是抽象方法继承...
  • 多重继承javaToday we will look into Multiple Inheritance in Java. Sometime back I wrote few posts about inheritance, interface and composition in java. In this post, we will look into java multiple ...
  • 为何Java不支持继承

    千次阅读 2017-07-30 16:59:02
    Java语言特性之一是, 确切的说,其类对于多继承不支持的(接口可以多继承),但是这是为什么呢?记得Thinking in Java中对于该问题有所阐述,单继承时,JVM的GC机制很好实现,有没有其他更深层次的原因呢? 2....
  • 展开全部Java对于多重继承是怎么实现的?首先回答这个问题之前,我需要说62616964757a686964616fe4b893e5b19e31333363363433明下什么是继承?什么多重继承和单继承?java采用何种机制来实现多重继承:1.1继承是...
  • 接口只是比抽象类“更纯”的一种形式。它的用途并不止那些。由于接口根本没有具体的实施...在C++中,将多个类合并到一起的行动称作“多重继承”,而且操作较为不便,因为每个类都可能有一套自己的实施细节。在Java...
  • java为什么不支持继承: 1.若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量。 2.若一个子类继承的多个父类拥有相同方法,同时子类并未重写该方法(若重写,则直接使用...
  • java为什么不允许多重继承

    千次阅读 2016-08-17 13:58:37
    李四继续回答:早说嘛,这样写有问题,会编译通过,因为java不允许多重继承。 张三:多重继承什么玩意儿 李四:假设java允许多重继承,那么Son就可以重载Father和Mother中的方法,这两个方法的参数列表、...
  • Java多重继承实现方法

    2019-10-16 09:41:22
    我们都知道,在Java中一个类可以多重实现,但是多重继承。也就是说一个类可以同时实现多个接口,但能同时继承多个类。有时候我们需要让一个类同时拥有多个类的行为功能。这时候使用单继承特性就很难解决问题了...
  • JAVA中的多层继承

    2018-02-18 19:16:06
    类的继承格式、继承的关系表示图、访问限制、子类对象的实例化过程、方法的覆写、属性的覆盖、Super关键字、this与super的区别
  • 多继承和多重继承

    2021-03-08 16:19:32
    -siwuxie095多继承 和 多重继承,两个词差别不大,但是差之毫厘、谬以千里 …多重继承如果有这样三个类:人类、士兵类、步兵类,其中:士兵类继承了人类,步兵类继承了士兵类,这三个类之间的关系称之为多重继承如果...
  • Java中实现多重继承

    千次阅读 2016-06-08 21:51:22
    常常使用继承单个类和集成多个接口的方式实现类的多重继承。 如下是多重继承示例:interface CanFight{ void fight(); } interface CanSwim{ void swim(); } interface CanFly{ void fly(); } class ...
  • Java多重继承的两种方式

    万次阅读 2019-01-30 17:00:57
    /*内部类使的多继承的实现变得更加完美了,同时也明确了如果父类抽象类或者具体类,那么我就仅能通过内部类来实现多重继承了。*/ public class UseInnerClassHandleMultiExtendsTest { public static void main...
  • James Gosling在1995年2月发表了一篇名Java概览”的Java白皮书,文章解释了Java不支持多重继承的原因。 Java去除了一些C++中很少用、而且被经常误解而错用的功能,如操作符的重载(operator overloading)(尽管...
  • Java中实现的多重继承

    千次阅读 2019-08-18 13:28:06
    首先,多重继承指的是一个类可以同时从多个的父类那里继承属性和行为,然而我们...所以我们的Java我们提供两种方式实现多重继承: 1:使用接口,并使用关键字(implements)来实现。 2:使用内部类来完成。 一、 接...
  • Java支持继承吗?

    千次阅读 2020-09-18 21:58:34
    Java支持继承吗?

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 67,198
精华内容 26,879
关键字:

为什么java不支持多重继承

java 订阅