オブジェクト指向プログラミングの場合、抽象化はその主要な機能の1つです。 Javaでは、OOPの抽象化は、インターフェイスと抽象クラスの2つの形式に反映できます。類似点が多すぎて、2つの間に違いが多すぎます。多くの人々は、初心者であるときに同じ意味で使用できると考えていますが、実際にはそうではありません。今日は、Javaのインターフェイスと抽象クラスについて学びます。この記事のディレクトリの概要は次のとおりです。
1。要約クラス
2。インターフェイス
3。抽象クラスとインターフェイスの違い
1。要約クラス
抽象クラスを理解する前に、まず抽象的な方法を理解しましょう。抽象的な方法は特別な方法です。宣言のみがありますが、具体的な実装はありません。抽象的な方法の宣言形式は次のとおりです。
Abstract void Fun();
抽象的なメソッドは、抽象キーワードを使用して変更する必要があります。クラスに抽象的なメソッドが含まれている場合、このクラスは抽象クラスと呼ばれます。抽象クラスは、クラスの前に抽象キーワードで変更する必要があります。抽象クラスには具体的な実装のないメソッドが含まれているため、抽象クラスを使用してオブジェクトを作成することはできません。
1つの問題は以下に注意する必要があります。「Javaプログラミング思考」という本では、抽象クラスは「抽象的なメソッドを含むクラス」として定義されていますが、後にクラスに抽象的なメソッドが含まれておらず、抽象的に変更されている場合、抽象クラスでもあることがわかりました。言い換えれば、抽象クラスは必ずしも抽象的な方法を含める必要はありません。個人的には、これは頑固な質問だと思います。抽象クラスに抽象的な方法が含まれていない場合、なぜ抽象クラスとして設計されるべきなのでしょうか?したがって、当面はこの概念を覚えておいてください。その理由を掘り下げる必要はありません。
[public] abstract class className {abstract void fun();}これから、抽象クラスが継承のために存在することがわかります。抽象クラスを定義していないが、それを継承しない場合、この抽象クラスを無駄に作成することと同等です。なぜなら、何もすることができないからです。親クラスの場合、その方法の1つが親クラスに実装されている場合、意味がなく、サブクラスの実際のニーズに応じて異なる方法で実装する必要がある場合、この方法は抽象的な方法として宣言でき、このクラスは抽象クラスになります。
抽象的なメソッドを含むクラスは抽象クラスと呼ばれますが、抽象的なメソッドが抽象クラスでのみ見つけることができるという意味ではありません。通常のクラスと同様に、メンバー変数や通常のメンバーメソッドを持つこともできます。抽象クラスと通常のクラスには3つの主な違いがあることに注意してください。
1)抽象的なメソッドは公開または保護されている必要があります(プライベートである場合、サブクラスによって継承できず、サブクラスがメソッドを実装できないためです)。デフォルトでは、公開されています。
2)抽象クラスを使用してオブジェクトを作成することはできません。
3)クラスが抽象クラスから継承する場合、サブクラスは親クラスの抽象的な方法を実装する必要があります。サブクラスが親クラスの抽象的な方法を実装していない場合、サブクラスも抽象クラスとして定義する必要があります。
他の面では、抽象クラスと通常のクラスの間に違いはありません。
2。インターフェイス
インターフェイスは、一般に、他の人が呼び出す方法または関数を指します。このことから、行動の抽象化であるJava Language Designersの当初の意図を理解できます。 Javaでは、インターフェイスの形式は次のとおりです。
[public]インターフェイスinterfaceName {}
インターフェイスには、変数とメソッドを含めることができます。ただし、インターフェイス内の変数は、パブリックスタティック最終変数として暗黙的に指定され(パブリック静的最終変数のみであり、プライベートの変更はコンパイルエラーを報告します)、メソッドはパブリックアブストラクトメソッドとして暗黙的に指定され、パブリックアブストラクトメソッドのみ(他のキーワードを使用します。実装、つまり、インターフェイス内のメソッドは抽象的なメソッドでなければなりません。ここから、インターフェイスと抽象クラスの違いを漠然と見ることができます。インターフェイスは非常に抽象的なタイプです。それは抽象クラスよりも「抽象」であり、通常、インターフェイス内の変数を定義していません。
クラスを特定のインターフェイスのグループに従うには、Implementsキーワードを使用する必要があります。特定の形式は次のとおりです。
class classNameはinterface1、interface2、[....] {}を実装しています
クラスは複数の特定のインターフェイスに従うことが許可されていることがわかります。非抽象クラスがインターフェイスに従う場合、そのインターフェイス内のすべてのメソッドを実装する必要があります。インターフェイスに従う抽象クラスの場合、そのインターフェイスの抽象的なメソッドは実装されない場合があります。
3。抽象クラスとインターフェイスの違い
1。文法レベルでの違い
1)要約クラスは、メンバーメソッドの実装の詳細を提供できますが、インターフェイスにはパブリックアブストラクトメソッドのみが存在できます。
2)抽象クラスのメンバー変数はさまざまなタイプである可能性がありますが、インターフェイス内のメンバー変数は、公共の静的な最終タイプのみであることができます。
3)インターフェイスには静的コードブロックと静的メソッドを含めることはできませんが、抽象クラスには静的コードブロックと静的メソッドがあります。
4)クラスは1つの抽象クラスのみを継承でき、クラスは複数のインターフェイスを実装できます。
2。設計レベルでの違い
1)抽象クラスは、物事の抽象化、つまりクラスの抽象化であり、インターフェイスは動作の抽象化です。抽象クラスは、プロパティや動作を含むクラス全体を抽象化しますが、インターフェイスはクラスの部分(動作)を抽象化します。簡単な例を挙げると、飛行機や鳥は異なるものですが、それらはすべて共通点が1つあります。つまり、すべて飛ぶ。その後、設計するとき、航空機は飛行機と鳥のような特性として設計できますが、飛行特性はクラスとして設計することはできません。したがって、それは単なる行動特性であり、タイプの抽象的な説明ではありません。現時点では、フライトはメソッドフライ()を含むインターフェイスフライとして設計でき、次に自分のニーズに応じて飛行機と鳥がハエインターフェイスを実装します。その後、戦闘機、民間航空機などのさまざまな種類の航空機については、飛行機を直接継承できます。鳥にも似ています。さまざまな種類の鳥が鳥のクラスを直接継承できます。ここから、継承は「はい」関係であり、インターフェイスの実装は「はい」関係であることがわかります。クラスが抽象クラスを継承する場合、サブクラスは抽象クラスの一種である必要があり、インターフェイスの実装は、鳥が飛ぶことができるかどうか(または飛行の特性があるかどうかなど)存在しない関係です。飛ぶことができれば、このインターフェイスを実現できます。飛ぶことができない場合、このインターフェイスが実現しません。
2)さまざまな設計レベル、抽象クラスは、多くのサブクラスの親クラスとしてテンプレートデザインです。インターフェイスは行動のコードであり、放射線設計です。テンプレートのデザインとは何ですか?最も簡単な例は、誰もがPPTでテンプレートを使用していることです。テンプレートAを使用してPPT BおよびPPT Cを設計する場合、PPT BとPPT Cの共通部分はテンプレートAです。パブリックパーツを変更する必要がある場合、テンプレートAを変更する必要があり、PPT BとPPT C.を変更する必要はありません。つまり、抽象クラスの場合、新しいメソッドを追加する必要がある場合は、抽象クラスに特定の実装を直接追加でき、サブクラスを変更できません。しかし、インターフェイスの場合、それは不可能です。インターフェイスが変更された場合、このインターフェイスを実装するすべてのクラスはそれに応じて変更する必要があります。
インターネット上で最も広く流通している例を見てみましょう。ドアとアラームの例:ドアには、open()とclose()の2つのアクションがあります。現時点では、抽象クラスとインターフェイスを使用して、この抽象的な概念を定義できます。
抽象クラスのドア{public abstract void open();パブリックアブストラクトボイドクローズ();}または:
インターフェイスドア{public abstract void open();パブリックアブストラクトボイドクローズ();}しかし、Alarm()の機能を持つためにドアが必要な場合、それを実装する方法は?次の2つのアイデアが提供されています。
1)3つの関数すべてを抽象クラスに配置しますが、このようにして、この抽象クラスから継承されたすべてのサブクラスにはアラーム機能がありますが、一部のドアには必ずしもアラーム機能がありません。
2)これら3つの関数すべてをインターフェイスに配置します。アラーム関数を使用する必要があるクラスは、このインターフェイスにopen()and close()を実装する必要があります。おそらく、このクラスには、火災警報器など、open()とclose()の2つの関数はまったくありません。
ここから、ドアが開いている()、close()、およびalarm()が単に異なるカテゴリの2つの動作に属していることがわかります。 open()およびclose()は、ゲート自体の固有の動作特性に属しますが、alarm()は拡張された追加の動作に属します。したがって、最良の解決策は、アラーム()の動作を含むインターフェイスとしてアラームを設計し、オープンおよび密接な動作を含む別の抽象クラスとしてドアを設計することです。別のアラームゲートは、ドアクラスを継承し、アラームインターフェイスを実装するように設計されています。
インターフェイスalram {void alarm();}要約クラスドア{void open(); void close();} class alarmdoor extendsドア実装アラーム{// ..} void close(){// ..} void alarm()void alarm(){// ...}}上記は、Javaインターフェイスと抽象クラスの編集です。 Javaプログラミングを学ぶ友人を助けることができることを願っています。