java中的多重inheritance

Java不允许从多个类inheritance(仍允许从多个接口inheritance。),我知道它非常符合经典的钻石问题。 但是我的问题是,当从多个基类inheritance时没有歧义(因此没有钻石问题的机会)时,java不允许像C ++这样的多重inheritance?

这是Java的设计决定 。 你永远不会得到它,所以不要太担心它。 尽管MI可能会帮助你制作Mixins,但这是唯一能帮助你的MI。

我已经读过大多数程序员不以正确的方式使用多重inheritance。 “继续并inheritance一个类只是为了重用代码”并不是多重inheritance的最佳实践。

在大多数情况下,许多程序员不知道何时使用简单inheritance。 必须谨慎使用多重inheritance,并且只有在您想要拥有良好设计时才知道自己在做什么。

我不认为java中缺少多重inheritance(如在c ++中)会对代码/应用程序设计/问题域映射到类中进行限制。

简单。 引用Tom Sintes的话

Java设计团队努力制作Java:

  • 简单,面向对象,熟悉
  • 健壮,安全
  • 架构中立且便携
  • 高性能
  • 解释,线程和动态

忽略Java语言的多重inheritance的原因主要来自“简单,面向对象,熟悉”的目标。 作为一种简单的语言,Java的创建者需要一种大多数开发人员无需大量培训即可掌握的语言。 为此,他们努力使语言尽可能与C ++类似(熟悉),而不会带来C ++不必要的复杂性(简单)。

在设计师看来,多重inheritance会导致比解决更多的问题和困惑。 因此,他们从语言中删除了多个inheritance(就像它们减少了运算符重载一样)。 设计师广泛的C ++经验告诉他们,多重inheritance并不值得头疼。

如果java支持多重inheritance,那么它可能会影响java的其他function
考虑用于调用超类构造函数的super()方法。如果程序有多个超类(因为多重inheritance),那么编译器会混淆应该调用哪个超类构造函数并抛出错误

Java设计师决定这样做。 可以通过使用接口来模拟多重inheritance。

一个简单的答案是Java中的所有类都派生自java.lang.Object IIRC。 所以,你总会遇到钻石问题… 😀

确实,Java并不使用支持多重实现inheritance(只是类型即接口)。 这是一个设计决定。

但是,从Java 8开始,它使用默认方法支持多重inheritance。 请参阅http://docs.oracle.com/javase/tutorial/java/IandI/multipleinheritance.html :

实现的多重inheritance是从多个类inheritance方法定义的能力。 这种类型的多重inheritance会出现问题,例如名称冲突和歧义。 …默认方法引入了一种forms的多重inheritance实现。

当多个父类定义它们自己的某些实现时,就会出现菱形问题,并且这两个类的子类必须处理使用哪个实现的模糊性。 那么,如果Java中的所有类都派生自Object,那就是单个父类。 “单父,多个派生类”与“多父母,单个派生类”不同