【发布时间】: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
可能重复:
Why there is no multiple inheritance in Java, but implementing multiple interfaces is allowed
为什么 Java 允许从接口进行多重继承,但不允许从抽象或具体类继承
【问题讨论】:
标签: java inheritance abstract-class
因为实现接口不是继承。它只是意味着您的类将遵守预定义的合同,通常是为了提供一组与特定功能相关的方法。任何类都可以遵守许多这样的约定而不会发生冲突(除非其中两个接口定义了相同的方法)。
与继承不同,它不会自动接收属性或功能,因为它与其超类存在层次关系,因为不存在这种关系。
由于已经提到的菱形继承问题,在 Java 或许多其他 OO 语言中基本上不允许多重继承。
【讨论】:
使语言更简单、更优雅。 C++ 允许很多东西,但学习和使用通常很痛苦。我们(我,至少 :))不希望 java 变成那样。
【讨论】:
我真的不喜欢这里的“继承”这个词,它会导致很多混乱。
Java 只允许接口扩展其他接口,并允许类实现接口。
如果您将接口视为一组数学声明,那么每个“扩展”仅提供来自超接口的集合与当前接口的集合的并集。因此,您可以进行多个“联合”。
当你最终得到一个实现一个或多个接口的类时,这里的语义仅仅是该类必须为集合中的所有方法提供实现。实现多个接口的类可以重写为实现扩展所有上述接口的单个接口的类。
在类继承多个类的情况下,这是不允许的,因为它会导致各种问题,包括菱形问题。例如,如果我有两个具有相同方法签名的不同实现的超类型,那么应该在子类型中使用哪一个?
【讨论】:
具体类的多重继承引发a variety of issues。
例如,如果一个类从两个不同的基类继承同一方法的两个不同实现怎么办?
为避免这些问题,Java 不支持此功能。
与具体类不同,接口不能有方法体。
因此,这些问题都不适用于接口。
【讨论】: