この記事では、Java の抽象クラスとインターフェイスの違いについて説明します。1. 構文レベルでの違い、2. 設計レベルでの違い。
1. 構文レベルでの違い
1) 抽象クラスはメンバーメソッドの実装の詳細を提供できますが、インターフェイスにはパブリック抽象メソッドのみが存在します
2) 抽象クラスのメンバー変数はさまざまな型にすることができます。インターフェイス内の変数は public static Final 型のみにすることができます。 3) インターフェイスには静的コード ブロックと静的メソッドを含めることはできませんが、抽象クラスは静的コード ブロックと静的メソッドを持つことができます。 4) クラスは継承のみ可能です。抽象クラスであり、クラスは複数のインターフェイスを実装できます。
2. 設計レベルでの違い
1) 抽象クラスは物の抽象化、つまりクラスの抽象化ですが、インターフェイスは動作の抽象化です。抽象クラスは属性や動作を含むクラス全体を抽象化しますが、インターフェイスはクラスの一部(動作)を抽象化します。簡単な例を挙げると、飛行機と鳥は種類が異なりますが、共通点は「空を飛べる」ということです。したがって、設計するときに、飛行機を飛行機のようなものとして、鳥を鳥のようなものとして設計することはできますが、飛行の特性をクラスとして設計することはできないため、それは単なる行動特性であり、飛行特性を抽象的に説明するものではありません。物のクラス。現時点では、Flight はメソッド fly() を含む Fly インターフェイスとして設計でき、Airplane と Bird はそれぞれのニーズに応じて Fly インターフェイスを実装します。戦闘機や民間航空機などのさまざまな種類の航空機については、Airplane を直接継承できます。鳥についても同様です。さまざまな種類の鳥も Bird クラスを直接継承できます。ここから、継承は「ある」関係であるのに対し、インターフェース実装は「ある」関係であることがわかります。クラスが抽象クラスを継承する場合、サブクラスは抽象クラスの型である必要があり、インターフェイスの実装は、鳥が飛べるかどうか (または飛ぶ性質があるかどうか) に関係します。 、飛べるかどうか 飛べないならこのインターフェースは実装できません。
2) デザインレベルが異なります。 抽象クラスは、多くのサブクラスの親クラスです。インターフェイスは動作仕様であり、放射状の設計です。テンプレートデザインとは何ですか?最も単純な例は、誰もが ppt でテンプレートを使用していることです。ppt B と ppt C がテンプレート A を使用して設計されている場合、ppt B と ppt C の共通部分はテンプレート A です。共通部分を変更する必要がある場合は、変更するだけで済みます。テンプレート A を変更するだけで十分です。ppt B と ppt C を再変更する必要はありません。たとえば、放射状の設計では、特定のエレベーターに何らかの警報が装備されており、警報を更新すると、すべての警報も更新する必要があります。つまり、抽象クラスの場合、新しいメソッドを追加する必要がある場合、抽象クラスに特定の実装を直接追加できます。サブクラスを変更する必要はありませんが、インターフェイスの場合、これは不可能です。が変更されると、このインターフェイスのすべての実装が影響を受けます。それに応じてクラスを変更する必要があります。
インターネット上で最も広く出回っている例の 1 つであるドアとアラームの例を見てみましょう。ドアには open() と close() という 2 つのアクションがあります。現時点では、この抽象概念を抽象クラスとクローズを通じて定義できます。インターフェース:
抽象クラス Door {
public abstract void open(); public abstract void close();
}
または:
interface Door {
public abstract void open(); public abstract void close();
}
しかし、ドアにalarm()の機能が必要な場合、それをどのように実装すればよいでしょうか?以下に 2 つのアイデアを示します:
1) これら 3 つの関数を抽象クラスに配置します。この方法では、この抽象クラスから継承されたすべてのサブクラスが警報関数を持ちますが、一部のドアには警報関数が必ずしもあるとは限りません。 2) これら 3 つの関数をインターフェイスに配置します。アラーム関数を使用する必要があるクラスは、このインターフェイスに open() と close() を実装する必要があります。おそらく、このクラスには open() と close() がまったくありません。 close() 火災警報器などのこれら 2 つの関数。
ここから、Door の open()、close()、alarm() は基本的に 2 つの異なる動作カテゴリに属し、open() と close() はドア自体の固有の動作特性に属していることがわかります。 () ) は拡張された追加の動作です。したがって、最善の解決策は、alarm() 動作を含むアラームをインターフェイスとして個別に設計し、開閉動作を含むドアを個別の抽象クラスとして設計することです。次に、Door クラスを継承し、Alarm インターフェイスを実装する警報ドアを設計します。
インターフェース Alram {
void alarm();
}
抽象クラス Door {
void open(); void close();
}
class AlarmDoor extends Door 実装 Alarm {
void oepn() { //.... } void close() { //.... } void alarm() { //.... }
}
関連記事:
インターフェースと抽象クラスの違い、インターフェース抽象class Java の インターフェースと抽象クラスの違いインターフェースと抽象クラスの違い - 最新の Java 完全ビデオチュートリアル
以上が構文レベルと設計レベルでの Java の抽象クラスとインターフェイスの違いの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。