質問: 開発中に気になったのですが何故Javaは多重継承が許されていないのですか? 調べてみると > > メソッド名が重複した場合の処置など、多重継承が様々な問題を引き起こしやすいからです > > > とのことですが、それなら多重継承しているクラスは必ずオーバーライドすればいいと思ったのですが。 また、`super.method()`のようにする時も多重継承しているなら`super.AClass.method()`のようにすれば困ることがあまりないと思います。 (一応言っておきますがinterfaceの多重継承ではありません。どちらもクラスの時です)
回答: 多重継承には、菱型継承問題(diamond problem)という有名な問題があります。 例えば、クラスDがBとCを継承しており、BとCが共通のAを継承しているような菱型の継承関係が多重継承では発生しえますが、この時にDに対してメソッド呼び出しがあった場合にどういった優先順位でメソッドを呼び出すのか、という問題です。Aで定義された`aMethod()`がBとCでオーバーライドされていた場合、Dに対して`aMethod()`が呼び出されたら、BとCのどちらを優先して呼び出せばいいでしょうか? 多重継承を持つ多くのプログラミング言語では、多重継承時のメソッド呼び出しに対して何らかの方法で優先順位を決めることで、この菱形継承問題を解決しています。しかし、言語によってルールは様々である上に、たとえルールが明確であったとしても、実用的なプログラムにおいて継承の階層が何重にもなって複雑化した場合には、継承の経路のどういった順番でメソッド呼び出しが行なわれるかを直感的にすぐ理解することは非常に難しくなるでしょう。 Javaでは(そして多くのモダンなプログラミング言語では)、言語設計としてこうした多重継承の問題による弊害が、それを導入した場合のメリットよりも大きいと判断して、単一継承を採用しています。 yohjpさんが回答されているJavaが「単純さを選んだ」ということを、もう少し具体的に説明するとこのようになります。