なぜインターフェースを使うのか, 複数継承とインターフェースの比較, インターフェースの利点?
質問
この件に関して、私はまだ混乱しています。私が今まで発見したことは
(似たような質問はすでにここでされていますが、私は他の点を持っていました。)
インターフェースは、ONLYの抽象メソッドと最終フィールドの集合体です。
Javaには多重継承はありません。
Javaで多重継承を実現するために、インターフェースを使用することができます。
継承の長所は、ベースクラスのコードを書き直すことなく派生クラスで使えることです。これは、継承が存在するための最も重要なポイントかもしれません。
今すぐ...
Q1. インターフェースは抽象的なメソッド(コードなし)しか持っていないので、インターフェースを実装していれば継承と言えるのでしょうか。そのコードを使用しているわけではありません。
Q2. インタフェースを実装することが継承でないとすると、多重継承を実現するためにインタフェースはどのように使われるのでしょうか。
Q3. インターフェイスを利用するメリットは何でしょうか? インターフェイスは、コードを持ちません。実装するすべてのクラスで、何度もコードを書き直す必要があります。
では、なぜインターフェースを作るのでしょうか?
注意。 インターフェイスが役に立つケースを一つ見つけました。例えば、Runnableインターフェースにはpublic void run()メソッドがあり、その中でスレッドの機能を定義し、このメソッドが別のスレッドとして実行されるようなコーディングが組み込まれています。つまり、私たちはスレッドで何をすべきかをコーディングするだけでよく、Restはあらかじめ定義されている。しかし、このことは抽象クラスなどを使っても実現できます。
では、インターフェイスを使うことのメリットは何なのでしょうか?インターフェイスを使って実現するのは、本当に多重継承なのでしょうか?
どのように解決するのですか?
インターフェースは、最終的な静的フィールドと抽象メソッドの集合体です(新たにJava 8ではインターフェース内に静的メソッドを持つことがサポートされました)。
インターフェイスは、あるタスクを実行しなければならないことは分かっているが、 その実行方法は様々であるような場合に作成されます。言い換えれば、私たちのクラスが特定の方法で動作するようにインターフェイスを実装すると言うことができます。
動物が何であるかは誰もが知っていることです。ライオンは動物、サルは動物、ゾウは動物、牛は動物といった具合です。そして、どの動物も何かを食べたり、眠ったりしていることは知っています。しかし、それぞれの動物によって、食べ方や眠り方は異なります。例えば、ライオンは他の動物を狩って食べますし、牛は草を食べます。でも、どちらも食べます。そこで、次のような擬似的なコードになります。
interface Animal {
public void eat();
public void sleep();
}
class Lion implements Animal {
public void eat() {
// Lion's way to eat
}
public void sleep(){
// Lion's way to sleep
}
}
class Monkey implements Animal {
public void eat() {
// Monkey's way to eat
}
public void sleep() {
// Monkey's way to sleep
}
}
上記の擬似コードのように、食べたり眠ったりすることができるものはすべて動物と呼ばれることになります。
インターフェイスの場合、クラスの継承のように実際のコードを継承するのではなく、振る舞いだけを継承します。
Q1. インターフェースは抽象的なメソッド(コードなし)しか持っていないので、インターフェースを実装していれば継承と言えるのでしょうか?そのコードを使用しているわけではありません。
インターフェースの実装は、他の種類の継承です。クラスの継承とは異なり、子クラスはベースクラスから再利用するための実際のコードを取得します。
Q2. インタフェースを実装することが継承でないとすると、多重継承を実現するためにインタフェースはどのように使われるのでしょうか。
一つのクラスが複数のインタフェースを実装できるためと言われています。しかし、この継承はクラスの継承とは異なることを理解する必要があります。
Q3. インターフェイスを使うメリットは何ですか? インターフェイスはコードを持ちません。実装するすべてのクラスで、何度も何度もコードを書く必要があります。
インターフェースを実装すると、その抽象的なメソッドをすべてオーバーライドしなければならないという強制力がクラスに働きます。
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
テストが空であるかどうかを判断するためのオプションの処理
-
[解決済み] この2回(1927年)を引き算すると、なぜおかしな結果になるのでしょうか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
-
[解決済み] いつ使うか。Java 8+のインターフェイスのデフォルトメソッドと、抽象的なメソッドの比較
-
[解決済み】「インターフェースに合わせたプログラム」とはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Javaでよくある構文エラー
-
Junitのユニットテストはjava.lang.Testを報告します。
-
List list = new ArrayList(); Error: ArrayList は型に解決できません。
-
Junitのユニットテストエラー
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
Spring Bootは、Tomcatの組み込みのmaxPostSizeの値を設定します。
-
[解決済み] インターフェースと抽象クラスの違いは何ですか?
-
[解決済み] インターフェースと抽象クラス(一般的なOO)
-
[解決済み] インターフェースとベースクラス
-
[解決済み】インターフェイスを作成するタイミングはどのように判断するのでしょうか?