为什么Java允许从多个接口继承,但不允许从抽象/具体类继承?

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

2
为什么Java中没有多重继承,但可以实现多个接口? - Vivin Paliath
4个回答

13

多继承具体类引发了各种问题

例如,如果一个类从两个不同的基类中继承了相同方法的两个不同实现,会怎样呢?

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

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


2
想要指出的是,这些问题“可以”得到解决(就像许多其他编程语言一样),只是做这件事没有太多意义。 - Nikita Rybak
我会告诉你为什么有人可能会对此进行投票否定。因为这仍然没有回答为什么的问题。你看,我可以有两个具有相同命名方法的独立接口。但是当我在一个类中实现它们时...IDE会要求你重写并创建自己的方法,以解决冲突。那么为什么Java不要求覆盖并编写自己的方法,如果我正在扩展的两个类具有相同的方法? - Yo Apps

3

实现接口并不等同于继承。它只是意味着你的类将遵守预定义的契约,通常提供一组与某种功能相关的方法。任何类都可以遵守许多这样的契约而不冲突(除非其中两个接口定义了相同的方法)。

与继承不同,它不会因为与其超类之间存在层次关系而自动获得属性或功能,因为不存在这样的关系。

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


1

我真的不喜欢这里使用“继承”这个术语,它会导致很多混淆。

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

如果您将接口视为一组声明的数学集合,则每个“extends”仅提供来自超级接口和当前接口的集合的并集。因此,您可以进行多个“并集”操作。

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

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


0
为了让编程语言更简单、更优雅,C++ 提供了很多功能,但学习和使用起来常常很痛苦。我们(至少我)不希望 Java 变成那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接