【问题标题】:Why does Java allow multiple inheritance from interfaces but not from abstract/concrete classes [duplicate]为什么Java允许从接口而不是从抽象/具体类进行多重继承[重复]
【发布时间】:2011-03-01 19:44:51
【问题描述】:

可能重复:
Why there is no multiple inheritance in Java, but implementing multiple interfaces is allowed

为什么 Java 允许从接口进行多重继承,但不允许从抽象或具体类继承

【问题讨论】:

标签: java inheritance abstract-class


【解决方案1】:

因为实现接口不是继承。它只是意味着您的类将遵守预定义的合同,通常是为了提供一组与特定功能相关的方法。任何类都可以遵守许多这样的约定而不会发生冲突(除非其中两个接口定义了相同的方法)。

与继承不同,它不会自动接收属性或功能,因为它与其超类存在层次关系,因为不存在这种关系。

由于已经提到的菱形继承问题,在 Java 或许多其他 OO 语言中基本上不允许多重继承。

【讨论】:

    【解决方案2】:

    使语言更简单、更优雅。 C++ 允许很多东西,但学习和使用通常很痛苦。我们(我,至少 :))不希望 java 变成那样。

    【讨论】:

      【解决方案3】:

      我真的不喜欢这里的“继承”这个词,它会导致很多混乱。

      Java 只允许接口扩展其他接口,并允许类实现接口。

      如果您将接口视为一组数学声明,那么每个“扩展”仅提供来自超接口的集合与当前接口的集合的并集。因此,您可以进行多个“联合”。

      当你最终得到一个实现一个或多个接口的类时,这里的语义仅仅是该类必须为集合中的所有方法提供实现。实现多个接口的类可以重写为实现扩展所有上述接口的单个​​接口的类。

      在类继承多个类的情况下,这是不允许的,因为它会导致各种问题,包括菱形问题。例如,如果我有两个具有相同方法签名的不同实现的超类型,那么应该在子类型中使用哪一个?

      【讨论】:

        【解决方案4】:

        具体类的多重继承引发a variety of issues

        例如,如果一个类从两个不同的基类继承同一方法的两个不同实现怎么办?

        为避免这些问题,Java 不支持此功能。
        与具体类不同,接口不能有方法体。

        因此,这些问题都不适用于接口。

        【讨论】:

        • 想补充说这些问题可以解决(就像许多其他语言一样),只是这样做没有多大意义。
        • 我会告诉你为什么有人会否决这个。 Bcz这仍然没有回答为什么?你看我可以有 2 个具有相同命名方法的独立接口。但是当我在一个类中实现这两者时......由于冲突,IDE会要求你覆盖并制作你自己的。现在,如果我扩展的 2 个类具有相同的方法,为什么 Java 不要求重写和编写自己的方法???
        猜你喜欢
        • 2011-06-21
        • 2018-08-10
        • 2019-03-08
        • 2021-01-02
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-01
        相关资源
        最近更新 更多