出典: http://blog.xiaohansong.com/2015/12/02/abstract-class-and-interface/
- 抽象クラスとインタフェースの比較
- コンテナクラスのJavaの設計から抽象クラスとインタフェースの応用を議論
- 抽象クラスとインタフェースを使用するとき
比較抽象クラスとインタフェース
パラメータ | 抽象クラス | インターフェース | |
---|---|---|---|
デフォルトのメソッドの実装 | それは達成するためのデフォルトの方法を持つことができます | インターフェイスは完全に抽象的です。これは単に実現を存在しません。 | |
実現 | サブクラスは、抽象クラスを継承するキーワードを拡張します。サブクラスは事の抽象一種ではない場合、それはすべての宣言のための抽象クラスの実装方法を提供する必要があります。 | キーワード道具を使用して、インターフェイスを実装するためのサブクラス。これは、すべての明記方法を達成するために必要なインタフェースを提供します | |
コンストラクタ | 抽象クラスは、コンストラクタを持つことができます | インタフェースのコンストラクタを持っていません | |
そして、通常のJavaクラスとの違い | あなたは、通常のJavaクラスの外抽象クラスをインスタンス化することはできません、それはどんな違いを確認しないことを除いて | インターフェイスは完全に異なるタイプです | |
アクセス修飾子 | 抽象メソッドは、パブリック、保護を持っており、これらの修飾子をデフォルトすることができます | デフォルトのインターフェイスメソッド修飾子はpublicです。あなたは、他の修飾子を使用することはできません。 | |
mainメソッド | 抽象メソッドは、mainメソッドを持つことができ、我々はそれを実行することができます | インターフェースは、メインメソッドではありません、我々はそれを実行することはできません。 | |
多重継承 | 抽象メソッドは、クラスを継承し、複数のインターフェイスを実装することができ | インタフェースは、1つまたは複数の他のインターフェイスを継承することができます | |
スピード | これは、インターフェイスの速度よりも速いです | それはクラスの実装で方法を見つけるには時間がかかるため、インターフェイスは、少し遅いです。 | |
新しいメソッドを追加します。 | あなたは抽象クラスに新しいメソッドを追加した場合、あなたはそれのデフォルトの実装を提供することができます。だから今、あなたはあなたのコードを変更する必要はありません。 | あなたは、インターフェイスにメソッドを追加する場合は、インターフェイスを実装するクラスを変更する必要があります。 |
抽象クラスとインタフェースは、同様の場所がある、異なっています。特別なクラスと呼ばれるインタフェースにいくつかの本は、正確ではないが、それはメリットを有していてもよく、インターフェースは抽象クラスは多重継承に加えて、行うことができ、行うことができます。これらの同様の特性のため、ので、それらを使用するときに我々は混乱を持っています。ここで、抽象クラスやインタフェースの最後には?
コンテナクラスのJavaの設計から抽象クラスとインタフェースの応用を議論
以前問題に言及したことに加えて:最後にポリモーフィックインタフェースまたは抽象クラスですか?今、最後の世紀と呼ばれてきた古いコード抽象クラスの農家を利用して、指向プログラミング・インタフェースを提唱している:私はまた誰かがコメントしていることを見ました。ハハ。私はまた、この引数が笑顔することはできません参照してください。指向プログラミング・インタフェースが実際に傾向である。しかし、Javaの8はすでにデフォルトのインターフェイスメソッドと静的メソッド、抽象クラスとインタフェースより多くの違いをサポートしています。さらに騒ぎがなければ、私たちは抽象クラスとインタフェースの応用を議論し始めます。
図は、コンテナクラスのJavaのクラス階層です。当社のコンテナクラス ArrayList
の例としては、抽象クラスとインタフェースの応用を議論します。
ArrayListにクラスの継承
この図は、ある ArrayList
クラス階層。それは見ることができArrayList
、両方の抽象クラスで使用される継承をインターフェイスを使用しています。
- トップレベルのインタフェースがあり
Iterable
、これはタイプは、反復可能であることを示すために。すべてのコンテナクラスが反復され、これは非常に抽象的です。 - 第二層インターフェイスである
Collection
容器の単一要素のインタフェースです。セットは、リストは、このカテゴリに分類されます。 - 第3層は界面で
List
、すべてのインターフェイスのリストです。
3つのインタフェースを通じて、我々はコンテナクラスの3つの抽象プロパティは、これらのインタフェースを実装して見つけることができることはプロパティは、これらのインタフェースを有することを意味します。
AbstractCollection
これは、実装Collection
プロセスの一部を。AbstractList
達成AbstractCollection
とList
プロセスの一部。
上記抽象クラスは、特定のクラスのコードの再利用を提供するために、いくつかの方法のデフォルトの実装を提供します。
純粋な抽象クラスを実装
我々は、上記のインターフェースの影響がどうなるかを実装するための抽象クラスのような古い農家の庭を、好きなら?だから、クラス図は、そうなる可能性があります。
大きな問題がある抽象クラス、それは、抽象化の高いレベル、また柔軟なインタフェースにはインタフェース多重継承することはできません。例えば、彼は言いました:
List + AbstractCollection -> AbstractList
Set + AbstractCollection -> AbstractSet
単に抽象クラスは、インタフェースの拡張ほど柔軟で達成することはできません使用しています。
ピュアインタフェース
私たちは農業などの新しいコードのような場合は、純粋なインタフェースは、それを達成するには?
何ら問題は質問が来たときに、実際にコードを書いて、存在しない理論を書きます。すべてのインターフェイスは達成するために提供されなければならないので、あなたは、各実装クラスにコードを複製する必要があります。
概要
上記の議論の後、我々は2つの結論になってきました。
- 抽象クラスとインタフェースはお互いを置き換えることはできません。
- 抽象クラスとインタフェースは、かけがえのない役割を担っています。
クラス図のコンテナクラスから見ることができる、抽象型のインタフェースは、主に共通に使用され、例えば、容器は反復性であってもよいと言います。主抽象クラスは、再利用可能なコードを具現化するクラスを提供することであるようにList
、デフォルトの方法の一部。
抽象クラスとインタフェースを使用するとき
だから、ときにそれを使用する際に、抽象クラス、インターフェイスを使用するには?
上記の問題を解決するために、我々は抽象クラスとインタフェースの関係を把握するために開始します。まず第一に、我々はすべてのプロパティと、物事の動作を定義するもの抽象クラスを知っています。抽象クラスは、不完全なクラス、抽象メソッドです。インターフェイスは、抽象クラスのレベルよりもさらに高いです。だから、我々はそれらの間の関係を理解することができます物事の抽象的であり、抽象クラスは抽象クラスであり、インターフェースは抽象クラス抽象的です。
このような観点、Javaコンテナクラスから、あなたはそれがこの関係の設計に反映されていることがわかります。それは違うのですか? Iterable
インターフェース、 AbstractList
抽象クラスへの ArrayList
クラス。
今、前の質問に答えるために:デザイン部門では、最初の抽象クラスとインターフェイスの特性を考慮し、あなたが再利用するいくつかの方法を見つけたとき、彼らはコードを再利用するために、抽象クラスを使用することができます。単純に、入れ抽象的なもの、コードの再利用のための抽象クラスのインターフェイス特性を。
もちろん、すべてのクラスがクラスに、抽象クラスへのインタフェースから設計する必要がありません。これは絶対に従わなければならないプログラミングパラダイムではありません。上記のステートメントはただ抽象クラスとインタフェースの間の関係を理解するための視点を提供することであり、一人一人が自分の理解を持つことになり、一部の人々は、2つのは何の関係もなかった、それも理にかなっていると思います。要するに、パターンや文法は、人々が生きている、死んでいます。
ます。https://www.cnblogs.com/tuanz/p/8709021.htmlで再現