主な違い:インタフェースまたはプロトコルは、無関係なオブジェクトが互いに通信できるようにする一般的な方法です。 これは、2つのオブジェクト間の対話を容易にする合意された動作を表します。 抽象クラスは、インスタンス化することもオブジェクトのインスタンスを設定することもできないオブジェクトのクラスです。 このクラスには実装がないか、不完全な実装になる可能性があります。
Javaはプログラミング言語であり、C言語の影響を受けています。 その構文の多くはCとC ++から派生していますが、どちらよりも低レベルの機能は少ないです。 Javaは、以前の言語に比べて実装の依存関係が少なくなるように設計されている汎用プログラミング言語です。 それは、並行、クラスベース、そしてオブジェクト指向言語です。
JavaはSun MicrosystemsのJames Goslingによって開発され、1995年にリリースされました。もともとはSun MicrosystemsのJavaプラットフォームのコアコンポーネントとしてリリースされました。 Sunはその後、GNU General Public Licenseの下で、そのJavaテクノロジのほとんどを再ライセンスしています。 これは、GNU General Public Licenseの下でライセンスされているすべての技術がオープンソースであり、一般に無料で利用できることを意味します。 Sun Microsystemsは最終的にOracle Corporationに合併しました。 2012年の時点で、Javaは最も普及しているプログラミング言語の1つになりました。 これは、クライアントサーバーWebアプリケーションに特に当てはまります。 他の多くのシステムは、Java用のGNUコンパイラやGNU Classpathなど、Sunのテクノロジの代替実装を開発しました。
抽象クラスは、インスタンス化することもオブジェクトのインスタンスを設定することもできないオブジェクトのクラスです。 このクラスには実装がないか、不完全な実装になる可能性があります。 また、すべてのサブクラスで共有される抽象メソッドまたはプロパティを持つこともできます。 プログラミング言語によっては、実装のない抽象型はインタフェースと呼ばれます。 Javaでは、クラス定義内のキーワード 'abstract'を使用して抽象型を作成できます。 抽象クラスに実装されていないすべてのメソッドを抽象クラスに入れ、それらをサブクラスに任せてこれらのクラスの実装方法を決定する目的。 クラスが単一の抽象メソッドを持つ場合、そのクラスは抽象クラスとして宣言する必要がありますが、クラス抽象を宣言するために少なくとも1つの単一メソッドを持つ必要はありません。
Malliktalksjava.inには、インターフェースと要約の主な違いがリストされています。
- 抽象クラスにはコンストラクタがありますが、インタフェースにはありません。
- 抽象クラスは、そのメンバのいくつか(メソッド)の実装を持つことができますが、インタフェースはそのメンバのいずれかの実装を持つことはできません。
- 抽象クラスは他には役に立たないサブクラスを持つべきです。
- インターフェースは他のクラスによる実装を持たなければなりません。
- あるインタフェースだけが別のインタフェースを拡張できますが、どのクラスも抽象クラスを拡張できます。
- インターフェース内のすべての変数はデフォルトではfinalです。
- インタフェースは、ある形式の多重継承を提供します。 クラスは他のクラスを1つだけ拡張できます。
- インタフェースは、実装されていないパブリックメソッドと定数に制限されています。 抽象クラスは、部分的な実装、保護された部分、静的メソッドなどを持つことができます。
- クラスはいくつかのインタフェースを実装できます。 しかし抽象クラスの場合、クラスは1つの抽象クラスのみを拡張できます。
- 実際のクラスで対応するメソッドを見つけるために追加の間接参照が必要になるため、インタフェースは遅くなります。 抽象クラスは速いです。
- アクセシビリティ修飾子(Public / Private / internal)は抽象クラスに使用できます。 インターフェースはアクセシビリティ修飾子を許可しません
- 抽象クラスは完全なまたは不完全なメソッドを含むことができます。 インターフェースは、メソッドのシグニチャーのみを含み、本体を含むことはできません。 したがって、抽象クラスはメソッドを実装できますが、インターフェイスはメソッドを実装できません。
- 抽象クラスは、フィールド、コンストラクタ、またはデストラクタを含み、プロパティを実装できます。 インターフェイスはフィールド、コンストラクタ、またはデストラクタを含むことはできず、プロパティのシグネチャのみを持ち、実装は持ちません。
- abstract、protected、internal、public、virtualなどのさまざまなアクセス修飾子は、抽象クラスでは役立ちますが、インタフェースでは役立ちません。
- 抽象スコープは派生クラス次第です。
- インタフェーススコープは、その継承チェーンのどのレベルにも及ぶ。
この表の情報は、codeproject.comおよびmindprod.comの提供によるものです。
インタフェース | 抽象クラス | |
多重継承 | クラスはいくつかのインタフェースを継承できます。 | クラスは1つの抽象クラスのみを継承できます。 |
デフォルト実装 | インターフェースはコードを提供することはできず、シグニチャだけを提供します。 | 抽象クラスは、完全なデフォルトコードおよび/またはオーバーライドする必要がある詳細のみを提供できます。 |
アクセス修飾子 | インタフェースは、subs、関数、プロパティなどのアクセス修飾子を持つことはできません。すべてがパブリックと見なされます。 | 抽象クラスには、subs、関数、プロパティに対するアクセス修飾子を含めることができます。 |
コアとペリフェラル | インターフェースはクラスの周辺機能を定義するために使用されます。 言い換えれば、HumanとVehicleの両方がIMovableインターフェースから継承できます。 | 抽象クラスはクラスのコアアイデンティティを定義し、そこでは同じ型のオブジェクトに使用されます。 |
均一性 | さまざまな実装がメソッドシグネチャを共有するだけの場合は、インターフェイスを使用することをお勧めします。 | さまざまな実装が同じ種類のものであり、共通の動作またはステータスを使用している場合は、抽象クラスを使用する方が適切です。 |
速度 | 対応するクラスで実際のメソッドを見つけるのにより多くの時間が必要です。 | 速い |
機能を追加する | インターフェースに新しいメソッドを追加すると、インターフェースのすべての実装を追跡し、新しいメソッドの実装を定義する必要があります。 | 抽象クラスに新しいメソッドを追加すると、デフォルトの実装を提供するオプションがあるため、既存のすべてのコードが正しく機能する可能性があります。 |
フィールドと定数 | インターフェースにはフィールドを定義できません。 | 抽象クラスはフィールドと定数を定義できます。 |
簡潔さ | インターフェース内の定数宣言はすべてpublic static finalと見なされます。 | 共有コードは抽象クラスに追加できます。 |
定数 | 静的最終定数のみが、インターフェースを実装するクラスで修飾なしにそれらを使用できます。 | インスタンス定数と静的定数の両方が可能です。 静的初期化コードとインスタンス初期化コードの両方で、定数を計算することもできます。 |
第三者による利便性 | インタフェースの実装は、既存のサードパーティクラスに追加できます。 | サードパーティのクラスは抽象クラスからのみ拡張するように書き直す必要があります。 |
is-a対-ableまたはcan-do | インターフェースは、クラスの中心的なアイデンティティではなく、クラスの周辺機能を記述するためによく使用されます。例えば、Automobileクラスはリサイクル可能なインターフェースを実装することができます。 | 抽象クラスは、その子孫の中心的なアイデンティティーを定義します。 実装されたインタフェースは、クラスができることではなく、クラスが実行できる一般的なことを列挙します。 Javaのコンテキストでは、ユーザーは通常、Threadを拡張するのではなくRunnableインターフェースを実装する必要があります。新しいThread機能を提供することにはあまり関心がないため、通常はコードに独立して実行する機能を持たせるだけです。 彼らは、新しい種類のスレッドではなく、スレッドで実行できるものを作成したいと考えています。 継承するか委任するかを決めるときに、似たような議論があります。 |
プラグイン | ユーザーは、既存の実装と共通のコードを1つも含まないインターフェース用の新しい置換モジュールを作成できます。 ユーザがインタフェースを実装するとき、それらはデフォルト実装なしで最初から始めます。 ユーザーは他のクラスからツールを入手する必要があります。 インタフェースには、いくつかの定数以外は何も付属していません。 これにより、ユーザーは根本的に異なる内部デザインを自由に実装できます。 | ユーザーは、コードクラスに抽象クラスをそのまま使用し、それに付随するすべての手荷物を使用する必要があります。 抽象クラスの作者がユーザーに構造を課しました。 |
メンテナンス | クライアントコードがインタフェースに関してのみ話している場合は、ファクトリメソッドを使用してその背後にある具体的な実装を簡単に変更できます。 | クライアントコードが抽象クラスに関してのみ話している場合は、ファクトリメソッドを使用してその背後にある具体的な実装を簡単に変更できます。 |