(1) 抽象クラスと抽象インターフェイスの両方に抽象メソッドを含めることができます。
(2) インターフェイスは定数のみを持つことができ、変数は持てませんが、抽象クラスは定数と変数の両方を持つことができます。
(3) 抽象クラスは非抽象メソッドを持つこともできますが、インターフェイスは持つことができません。
プログラムを設計するときは、具体的な分析に基づいて、抽象クラスとインターフェイスのどちらを使用するかを決定する必要があります。抽象クラスは、サブクラスによってオーバーライドする必要がある重要な抽象メソッドを提供するだけでなく、サブクラスが継承できる変数と非抽象メソッドも提供します。
特定の問題を継承を使用してより適切に解決する必要がある場合、たとえば、親クラスの抽象メソッドをオーバーライドすることに加えて、サブクラスはいくつかの変数を継承するか、親クラスからいくつかの重要な非抽象メソッドを継承する必要もあります。抽象種類の使用を検討してください。特定の問題で継承が必要なく、いくつかの重要な抽象メソッドの実装の詳細を提供するためにいくつかのクラスだけが必要な場合は、インターフェイスの使用を検討できます。
注: JDK1.8 インターフェイスは、静的メソッドとデフォルト メソッドをサポートしています。
1) インターフェイスを使用してオブジェクトをインスタンス化することはできません。
2) インターフェイスにはコンストラクター メソッドがありません。
3) インターフェース内のすべてのメソッドは抽象メソッドである必要があります。
4) インターフェイスには、静的変数と最終変数を除き、メンバー変数を含めることはできません。
5) インターフェイスはクラスによって継承されませんが、クラスによって実装されます。
6) インターフェースは多重継承をサポートします。
デフォルト メソッドは、インターフェイスが実装メソッドを持つことができ、そのメソッドを実装するための実装クラスを必要としないことを意味します。デフォルト メソッドを実装するには、メソッド名の前にdefaultキーワードを追加するだけです。デフォルトのメソッドは、既存のコードを壊すことなくインターフェイスを拡張する方法を提供します。
(1) インターフェイスには複数のデフォルト メソッドと静的メソッドを含めることができます。
(2) デフォルト メソッドはインスタンスを通じて呼び出され、静的メソッドはインターフェイス名を通じて呼び出されます。
(3)default キーワードはインターフェイスでのみ使用できます。
(4) デフォルト メソッドは継承できます。複数のインターフェイスを継承し、複数のインターフェイスで同じデフォルト メソッドが複数定義されている場合、実装クラスでデフォルト メソッドをオーバーライドする必要があります。オーバーライドしないとエラーが報告されます。
(5) 静的メソッドは継承やオーバーライドができないため、特定のインターフェイスからのみ呼び出すことができます。
注: JDK 1.9 以降では、メソッドをプライベートとして定義できるため、再利用される特定のコードはメソッドを公開しません。