「Javaでは多重継承ができない」「インターフェイスでは多重継承できる」の意味が分かりません。
「インターフェイス」の多重継承とは、あくまでも擬似多重継承であって、本当の多重継承とは機能が異なる、ということなのでしょうか?
それとも、多重継承はあくまでもクラスに対して行う言葉であり、それをインターフェイスで実現しているから、擬似なのでしょうか? つまり、機能としては完全に多重継承と同一?
あるいは、それ以外?
インターフェイスで可能なら、Javaで多重継承ができないという表現はおかしいように思うのですが…。
例えば、Javaのクラスでは多重継承できない、という言い方だと、また違った意味になるのでしょうか?
No.2
- 回答日時:
現状はNo.1の方の回答でいいかと思いますが、
Java 8ではインターフェースでもメソッドの実装ができます。
implementsに複数のインターフェースを記述して、
そのどちらにも同じ名前、引数のメソッドの中身が実装されていれば、
implementsしたクラスでどちらの実装を使うか選択する必要があります。
ただ、インターフェースではクラスの状態を保持管理することはできないので、
それも複数のクラスから継承されるC++と同じになった、ということではありません。
まあ、実際にどう動くのか把握していれば、多重継承云々の言い回しは、
あまり気にしなくてもいいのではないかと思います。
回答ありがとうございました。
>Java 8ではインターフェースでもメソッドの実装ができます
・知りませんでした
・参考になりましたー
No.1ベストアンサー
- 回答日時:
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 …
)
上記の例を見れば解ると思うのですが、最初に述べた「(多重継承で)問題を引き起こすもの」というのは実装にかかわるもの(メソッド実装、インスタンス変数)のことです。インターフェースはこれらを持てないため、複数のインターフェースを implememts できます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 歴史学 日本では先祖の名前(姓でない方)の一字を継承し、中国・朝鮮では継承しない、という違いはどこから生まれ 6 2022/10/12 16:29
- 政治 立憲泉さんが壊れたロボットみたいになってるけど、大丈夫か? 立憲民主を擁護している方々も多いけど、や 2 2022/10/22 10:46
- 世界情勢 ヘンリー王子に新たに子供が生まれたら、王位継承権はありますか? イギリス王家離脱 1 2023/02/02 17:28
- 倫理・人権 なぜ「女系」ではだめなのでしょうか?本質的には「男系」と同じことではないでしょうか? 20 2023/05/15 21:28
- C言語・C++・C# C# 継承の問題で programに示された拡張をすべて含んだ上で,クラス Mammal に,そのオ 1 2022/07/22 09:48
- 政治 もともと天皇位継承の「男系」重視の存続は、側室制度と一体だったんですか? 3 2023/01/14 18:14
- その他(暮らし・生活・行事) 親が低学歴で低収入で大変な体を酷使する仕事して、家に帰った世の中の文句ばかり言って、夫婦でお金のこと 5 2022/11/07 23:46
- 弁護士・行政書士・司法書士・社会保険労務士 管理費滞納債務の特定承継人への承継 6 2022/04/02 16:59
- 相続・遺言 元配偶者の子の相続権について 3 2022/07/27 20:39
- その他(悩み相談・人生相談) 回答者さんだったらどっちを選びますか?理由も教えてください! 貴方の身内の中で長年にわたり会社経営を 3 2022/09/23 20:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
抽象クラスからオーバーライド...
-
JavaにListElement型ってあるん...
-
委譲って何ですか?
-
setTextについて
-
抽象クラスのエラーが出ます
-
単体テストのテストケースにて...
-
絶対パス ⇒ フォルダかファイル...
-
interface,extend,implementの...
-
「インターフェイス」って何の...
-
System.Collections.Generic.Li...
-
VB DLLプロジェクトについて
-
インタフェースのstatic変数(Java)
-
クラスは関数の寄せ集め??
-
Javaのインターフェイスの意味
-
ASP.NETでの共通コードの書き方...
-
「ラッパークラス」の存在意義...
-
JavaでのAPIの覚え方ってみさな...
-
WEBサイトを訪れたときの通知の...
-
JTextFieldの入力制限
-
抽象クラスとインタフェースの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
interface,extend,implementの...
-
(vba)他のアプリケーションの右...
-
抽象クラスをJUNITでテストする...
-
「ラッパークラス」の存在意義...
-
ASP.NETでの共通コードの書き方...
-
JTextFieldの入力制限
-
「継承されたメソッドの可視性...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
c++でのヘッダーファイルの循環...
-
【C#】クラスのコンストラクタ...
-
「IOException は対応する try ...
-
ファイルパスが取得出来ない(P...
-
メソッドの引数にクラス名を渡す
-
ゲッターを使わないで変数にア...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
vb.net 自作プロパティの削除に...
-
なぜインタフェースを使うのか?
-
VBがオブジェクト指向言語でな...
おすすめ情報