【问题标题】:Does Java support Mulitiple Inheritance?Java 是否支持多重继承?
【发布时间】:2011-03-14 12:26:43
【问题描述】:

从 Java 的事实来看,Java 中的所有类都有一个父类 Object。但是同一个Java说它不支持多重继承。但是这段代码是什么意思呢?

public class A extends B
{
          //Blah blah blah
}

从上面的代码可以看出,A 类扩展了B 类。现在A 类也继承了Object 类的属性,它是B 的超类。这不是说A类同时继承了BObject类,这就是我们所说的多重继承吧?

所以现在Java支持多重继承,如果不是那么上面代码的答案是什么(显示多重继承)

【问题讨论】:

  • 你所拥有的可以称为多级继承,这是另一回事。
  • 多级单继承,也许吧?

标签: java oop inheritance


【解决方案1】:

不,这是单继承。 A从B继承,B从Object继承。

多重继承将是ABC扩展,其中BC不会相互继承,这可能会导致Diamond Problem

如果B定义了一个方法foo()C也定义了一个方法foo(),我这样做:

new A().foo();

将使用哪个foo() 实现?

这在许多语言中都是一个大问题,因此 Java 设计者决定不允许多重继承。

【讨论】:

  • Java 确实支持“多接口继承”。你可以有:interface Foobar extends Foo, Bar.
  • @Martinho 我知道,我把它留给了别人 :-)
【解决方案2】:

多重继承具有超过 1 个直接基类。您给出的示例是单继承。

例如,如果您有 3 个类 ABC...

public class A extends B

public class B extends C

仍然只是单继承。
多重继承将是

public class A extends B, C

【讨论】:

    【解决方案3】:

    Java 不支持开发人员的多重继承。在幕后,编译器确保一切都扩展了 Object。

    基本上编译器会修改

    公共A类扩展对象,B实际上是A类扩展B和B类扩展对象。

    【讨论】:

    • 真的吗?编译器会这样做吗?这意味着 JVM 支持 MI,但语言不支持,对吗?我发现这值得怀疑,因为 JVM 是专门为运行 Java 而构建的。
    • 我不确定我所描述的是 JVM 中的 MI?我在这里做假设,因为我不知道编译器的实现,但我的理解是编译器会查看你的类的层次结构,并有效地将“扩展对象”添加到最后一个超类中等级制度。它可能不会像那样实现,但这就是效果。这里的 JVM 中没有 MI。
    • (好吧,我被public class A extends Object, B 部分弄糊涂了。那编译不正确?)我认为算法可以非常简单:只需将extends Object 拍到没有extends 的类。无需访问层次结构。
    • 我认为编译器添加了扩展对象,但IFF没有什么可以通过extends关键字指定类直接扩展
    【解决方案4】:

    多重继承意味着一个类扩展另外两个类。例如,允许多重继承C++。但这不一样:

    class Object {
    ...
    }
    
    class B extends Object { //default, not need to be there
    ...
    }
    
    class A extends B {
    ...
    }
    

    【讨论】:

      【解决方案5】:

      从 Java 的事实来看,Java 中的所有类都有一个父类作为 Object

      其实不,那不是真的。 Object 只是 默认 父类。如果您明确指定父级,如您的示例 (A extends B),则您定义的类不再将 Object 作为直接父级。

      但是,Object 是默认值这一事实意味着,如果没有超类,就不可能创建一个类(Object 本身除外)。由于每个类都必须有一个超类,因此每个类都必须在某种程度上将Object 作为祖先

      【讨论】:

      • 当然,Object 本身有特殊规则。 Object 简直就是魔法。
      • @Anto:我想说Object 是唯一可以在没有超类的情况下存在的类。不知何故,我在大卫的回答中错过了“(Object 本身除外)”。
      猜你喜欢
      • 2016-08-24
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-11
      • 1970-01-01
      • 1970-01-01
      • 2011-10-16
      相关资源
      最近更新 更多