- ベストアンサー
Javaでは多重継承ができない、の意味が分からない
「Javaでは多重継承ができない」「インターフェイスでは多重継承できる」の意味が分かりません。 「インターフェイス」の多重継承とは、あくまでも擬似多重継承であって、本当の多重継承とは機能が異なる、ということなのでしょうか? それとも、多重継承はあくまでもクラスに対して行う言葉であり、それをインターフェイスで実現しているから、擬似なのでしょうか? つまり、機能としては完全に多重継承と同一? あるいは、それ以外? インターフェイスで可能なら、Javaで多重継承ができないという表現はおかしいように思うのですが…。 例えば、Javaのクラスでは多重継承できない、という言い方だと、また違った意味になるのでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Java で言う継承は extends で行われるものです。その意味で Java では多重継承ができません。 多重継承は慎重に慎重を重ねてクラス設計をしないと(いや、慎重に設計したとしても)問題を引き起こす可能性が大きいためです。 ではなぜインターフェースの implements で複数のインターフェースが指定可能かというと、インターフェースが問題を引き起こすものを持たないために複数指定可能だからです。 多重継承の問題点は簡単に言うと、以下のコードに現れます。 class A { public void say() { System.out.println("I'm A."); } } class B { public void say() { System.out.println("I'm B."); } } class C extends A, B {} // こんな書き方はできないが、説明のため // ------------ コードのどこかで C c = new C(); c.say(); // さて、なんて出力しよう? 上記の例では say() の実装が C では A と B の両方からもたらされるため、どちらを採用すればいいのかわからなくなっています。 後だしのほうの実装を採用すればいい(あるいはその逆)? では A と B に複数のメソッドがあって A の一部と B の一部の両方を使いたい場合はどう解決します? (さらにさかのぼって言えば、A, B に共通の親クラス C0 があって、 C0 c0 = new C(); c0.say(); // さて、なんて出力しよう? という場合のほうが深刻なのですが。 https://ja.wikipedia.org/wiki/%E8%8F%B1%E5%BD%A2%E7%B6%99%E6%89%BF%E5%95%8F%E9%A1%8C ) 上記の例を見れば解ると思うのですが、最初に述べた「(多重継承で)問題を引き起こすもの」というのは実装にかかわるもの(メソッド実装、インスタンス変数)のことです。インターフェースはこれらを持てないため、複数のインターフェースを implememts できます。
その他の回答 (1)
- aozakana_dha
- ベストアンサー率45% (76/168)
現状はNo.1の方の回答でいいかと思いますが、 Java 8ではインターフェースでもメソッドの実装ができます。 implementsに複数のインターフェースを記述して、 そのどちらにも同じ名前、引数のメソッドの中身が実装されていれば、 implementsしたクラスでどちらの実装を使うか選択する必要があります。 ただ、インターフェースではクラスの状態を保持管理することはできないので、 それも複数のクラスから継承されるC++と同じになった、ということではありません。 まあ、実際にどう動くのか把握していれば、多重継承云々の言い回しは、 あまり気にしなくてもいいのではないかと思います。
お礼
回答ありがとうございました。 >Java 8ではインターフェースでもメソッドの実装ができます ・知りませんでした ・参考になりましたー
お礼
回答ありがとうございました。 大変参考になりましたー