Javaの抽象クラスとインタフェースの間のコントラスト
まず、インターフェース
Interface
、それはよりよく理解されるかもしれないソケットに翻訳。通常、インタフェースの実装クラスの振る舞いを定義するために使用されますが、ノートパソコンの三角形のアンプラグのソケットを接続したときに、電子レンジを交換するプラグイン、あなたは三角形のプラグインであるこれら二つのものがあります。次いで、プラグ三角形が規則とみなすことができるが、これら2つのアプライアンスは、同じルールの2人のメンバーを達成することです。動的に別のメンバーによって置き換えられているので、ルールは、同じことを達成するのでメンバーがはるかに容易になります。だから、コード内で2つのクラスが同じインタフェースを実装して同じ真実であり、他に元の実装クラスのクライアントは、それが容易になります。
まず、次のコードは、インタフェースを定義します。
[public] interface InterfaceName {
void fun1();
}
インターフェースが暗黙的にデフォルトされるインタフェースで定義された変数やメソッドが、変数を持つことができているpublic static final
変数、および変更した他の修飾子を使用している場合にのみ、エラーコンパイル時だろう、そうすることができます。同様に、デフォルトの方法を説明するpublic abstract
修飾されました。しかし、あなただけのメソッドを定義することができますが、実装クラスのメソッドを持つことができない、方法が異なると抽象クラス(抽象クラスを達成するためのメソッドを持つことができます)にあるインターフェースすることができます唯一の抽象メソッドです。
そして、インタフェースの実装クラスは、以下の例のコードに対応します
public class ClassName implements InterfaceName, OtherInterface, [...] {
public void fun1() {
// do something ...
}
}
Javaでは、クラスは、単一継承であるが、複数のインタフェースを継承することができ、そしてインターフェースは複数のインタフェースを継承することができます。
第二に、抽象クラス
Java言語では、2つのカテゴリーがあります:1は、具体的なクラスであり、他方は抽象クラスです。特定のクラスをインスタンス化することができ、ない抽象クラスはインスタンス化されます。だからここにあなたが結局、あなたがクラスを使用することはできません、継承する、抽象クラスを作成し、考えることができ、これはコール静的変数やメソッドが含まれていませんが、あなただけ使用した場合のコース(あなたのために何の機能を達成するためにインスタンス化することはできませんこれを行うには、なぜあなたは、このクラスは、それ抽象として宣言されたいですか?)
抽象クラスを理解する前に、我々は最初の抽象メソッドを理解する:抽象メソッドは、特別な方法であり、それが唯一の文が、具体的な実現です。
abstract void fun1();
抽象メソッドは、クラス定義を使用する必要があります描画でabsract
キーワードの変更を、同じ抽象クラスもする必要がabstract
キーワードに変更します
[public] abstract class AbstractClassName {
abstract void fun1();
}
クラスは抽象クラスを継承する場合は、サブクラスも抽象クラスとして定義されていない限り、抽象クラスで定義されているすべての抽象メソッドを実装する必要があるサブクラス。
第三に、比較
文法的な機能をコントラスト
- インターフェイスは、抽象メソッドを含めることができ、通常の方法では、抽象クラス、抽象メソッドを持つことができますすることができます
- インタフェースはコンストラクタが含まれていない、抽象クラスは拡張クラスの継承を準備するためにコンストラクタが含まれていてもよいです
- インターフェースコードブロックは、静的コードブロックと静的メソッドを有することができ、静的メソッドと静的、抽象クラスを含めることはできません
- インターフェイスは、両方の抽象クラスは、共通の属性を定義することができ、静的定数プロパティを定義することができます。また、静的定数プロパティを定義することができます
デザイン思考の比較
私たちは、多くの場合、口頭で言う:、インタフェースを実装する抽象クラスを継承しています。実際には、この文が表示インタフェースと抽象クラスの間の区別を有しています。
インターフェイスは、契約はあなたが達成できるようにすることです契約の多くを考えられています。誰かがあなたに、あなたがこの方法で達成するためのインタフェースで定義されますインターフェイスを与えられたとき、それは契約の実現です。だから、実際には、インターフェイスメソッドがコースから特定の方法に特徴がある方法の特徴のコレクションですが、彼らはシステムに、一般的に新興国からのいくつかの方法があります。プロセスの1つのインターフェイスだけの機能が、これらの方法のない実装が実装される別の場所ではありません、異なる動作を持つことができます。
より抽象クラスはテンプレートとみなされ、それは継承された出発点を提供し、それは、サブクラスの共通部分を達成することに焦点を当てています。だから、抽象クラスは、テンプレート・スタイルのデザインは、テンプレートのデザインは何ですか?PPTのBとPPTのCを設計した場合、最も単純な例では、我々は、PPTテンプレート内で使用しているテンプレート、PPTのBとのppt C彼らは変更する公共の必要性の一部である場合の部分は、あなただけ変更する必要がありますされ、共通のテンプレートテンプレートは、変更を行うためにBとPPTのC-PPTの再する必要はありませんすることができます。それはあなたが抽象クラスの具体的な実現に直接添加することができる新しいメソッドを追加するには、サブクラスを変更することはできません必要な場合は、抽象クラスのためであり、インタフェースが変更された場合のインターフェースのために、このインタフェースのすべての実現ではありませんクラスは、適切な変更を加える必要があります。
第四に、達成するために再利用や規範の間で選択継承
インターフェイスは、インターフェイスの際に選択、そして開発に、抽象クラスの特別な種類のですか?場合は、抽象クラスの選択は、それ?
- 好ましい界面
次のすべての条件が満たされる場合には、抽象クラスの選択
サブクラスではなく、二つの異なる関係の「HAS-A」および「IS-A」を区別することである親の役割、より、親クラスの特別なクラスです。-た関係は集約関係を用いて説明する必要がありますが、唯一のIS-関係は、継承と一致しています。
あなたは、クラスの別の状況サブクラスにサブクラス化する必要はありません。
サブクラスは親クラスを拡張する責任があります。代わりに置き換えて(上書き)または償却責任(無効化)親クラスを持ちます。子クラスは、多数の親クラスの振る舞いを変位必要がある場合、これはこのサブクラス親クラスのサブクラスになってはいけません。
彼らは継承を使用することができます前に、親と子のクラスが同じ分類に属している場合にのみ、ツールから継承しません。
五、Javaの8の新機能
Javaの8以降では、インタフェースはまた、彼らは、デフォルトのインターフェイスメソッドのメンテナンスコストが高すぎるサポートしていないため、これを達成するためのデフォルトの方法があることができます。Javaの8の前に、インターフェイスは、インターフェイスを実装するすべてのクラスを変更するために、その後、新しいメソッドを追加したい場合。
public interface InterfaceExample {
void func1();
default void func2(){
System.out.println("func2");
}
}
public class InterfaceImplementExample implements InterfaceExample {
@Override
public void func1() {
System.out.println("func1");
}
}
public static void main(String[] args) {
InterfaceExample example = new InterfaceImplementExample();
example.fun1();
example.fun2();
}
第六に、参照
- 「Javaとモデル、」
- https://www.cnblogs.com/felixzh/p/5938544.html
- https://www.cnblogs.com/devinzhang/archive/2011/12/24/2300260.html
- https://github.com/CyC2018/CS-Notes/blob/master/notes/Java%20%E5%9F%BA%E7%A1%80.md#%E6%8A%BD%E8%B1%A1 %E7%B1%BB%E4%B8%8E%E6%8E%A5%E5%8F%A3