为什么Java允许从接口进行多重继承,而不允许从抽象类或具体类进行多重继承?
多继承具体类引发了各种问题。
例如,如果一个类从两个不同的基类中继承了相同方法的两个不同实现,会怎样呢?
为避免这些问题,Java 不支持这一特性。
与具体类不同,接口不能有方法体。
因此,这些问题都不适用于接口。
实现接口并不等同于继承。它只是意味着你的类将遵守预定义的契约,通常提供一组与某种功能相关的方法。任何类都可以遵守许多这样的契约而不冲突(除非其中两个接口定义了相同的方法)。
与继承不同,它不会因为与其超类之间存在层次关系而自动获得属性或功能,因为不存在这样的关系。
由于已经提到的菱形继承问题,Java或许多其他面向对象语言基本上不允许多重继承。
我真的不喜欢这里使用“继承”这个术语,它会导致很多混淆。
Java只允许接口扩展其他接口,并且类实现接口。
如果您将接口视为一组声明的数学集合,则每个“extends”仅提供来自超级接口和当前接口的集合的并集。因此,您可以进行多个“并集”操作。
当您最终到达实现一个或多个接口的类时,这里的语义仅是该类必须为集合中的所有方法提供实现。实现多个接口的类可以重写为实现单个接口,该接口扩展了所有上述接口。
在类继承多个类的情况下,这是不允许的,因为它会导致各种问题,包括钻石问题。例如,如果我有两个具有相同方法签名的不同实现的超类型,那么子类型应该使用哪一个?