抽象化はオブジェクト指向設計の主要な機能の 1 つであり、Java での抽象化の具体化は抽象クラスと抽象インターフェイスです。この 2 つは非常によく似ており、多くの初心者でも抽象化はオブジェクト指向設計の主要な機能の 1 つであり、Java での抽象化は抽象クラスとインターフェイスによって表現されます。この 2 つは非常に似ており、多くの初心者だけでなく、数年間 Java を使用してきた人でも区別するのは困難です。今日、コレクションクラスに関連するコードを見ていたら、List、Mapなどのインターフェイスもあれば、AbstractList、AbstractSetなどの抽象クラスもあることがわかりました。この2つについては明らかですが、混乱しています。そこで今回は筆者が両者の違いを中心に紹介します。
抽象クラス
抽象メソッド
抽象を使用して、宣言だけで実装はしないメソッドを変更することを抽象メソッドと呼びます。例:
abstract void fun();
Abstract class
abstract で変更されたクラスは、抽象クラスと呼ばれます。例:
abstract class ClassA{}
抽象メソッドを持つクラスは抽象クラスである必要があります。抽象クラスには抽象メソッドを含めることはできません。抽象クラスは、通常のクラスと同様に、メンバー変数と通常のメンバー メソッドを持つことができます。
抽象クラスには具体的な実装のないメソッドが含まれているため、抽象クラスを使用してインスタンス オブジェクトを作成することはできません。もちろん、クラスは抽象クラスでのみ変更され、抽象メソッドを持たない可能性があります。これも抽象クラスであり、インスタンス化できません。しかし、抽象メソッドがない場合、なぜそれを抽象クラスとして設計するのでしょうか?したがって、それを掘り下げる必要はありません。
Function
つまり、抽象クラスは継承のために存在することがわかります。抽象クラスを定義しても継承しない場合は、役に立ちません。もちろん、継承後、クラスは親クラスに実装されていないメソッドをすべて実装する必要があります。それ以外の場合は許可されません(抽象クラスから継承された抽象クラスでない場合、実装する必要はありません)。
と通常のクラスの違い
抽象メソッドは、パブリックまたは保護されている必要があります (プライベートの場合、サブクラスに継承できず、サブクラスはメソッドを実装できないため、デフォルトではパブリックです)。
抽象クラスをオブジェクトの作成に使用することはできません。
サブクラスが抽象クラスを継承する場合、サブクラスは親クラスの抽象メソッドを実装する必要があります。それ以外の場合は、サブクラスも抽象クラスとして定義する必要があります。
他の側面では、抽象クラスと通常のクラスに違いはありません。
インターフェース
インターフェースは非常に抽象的な型であり、抽象クラスよりも抽象的です。インターフェイスには変数とメソッドを含めることができます。ただし、インターフェイス内の変数は暗黙的にパブリック静的最終変数として指定されます (プライベートなどの他の型として定義すると、エラーが報告されます)。これは、変数を初期化する必要があることも意味します。インターフェイス内のメソッドは、パブリック抽象メソッドとして暗黙的に指定されます (private、protected、static、final などの他のキーワードを使用すると、エラーが発生します)。
そして、インターフェース内のすべてのメソッドは特定の実装を持つことができず、インターフェース内のメソッドは抽象メソッドでなければなりません。
同様に、非抽象クラスがインターフェイスを実装する場合、すべてのメソッドを実装する必要があります。それ以外の場合、クラスは抽象クラスまたはインターフェイスでなければなりません。
抽象クラスとインターフェイスの比較
構文レベルでの違い
インターフェイスはパブリック抽象メソッドのみを持つことができ、抽象クラスはより多くのメソッド型を持ち、通常のメソッドを持つことができます
インターフェイスのメンバー変数はパブリック静的最終型のみにすることができます。はい、抽象クラスにはより多くの変数型があり、通常の変数を持つことができます。
インターフェイスには静的コード ブロックと静的メソッドを含めることはできませんが、抽象クラスは静的コード ブロックと静的メソッドを持つことができます。
クラスは 1 つの抽象クラスのみを継承できます。複数のインターフェイスを実装できます。
デザインレベルでの違い
1) 抽象クラスは物事を抽象化したもの(クラスの抽象化)、インターフェースは動作を抽象化したものです。
例えば、Birdは抽象クラスとして定義されており、様々なbirdがそれを実装しています。 fly というインターフェイスを定義すると、さまざまな鳥がこのインターフェイスを実装できます。平たく言えば、継承は「ある」関係ですが、インターフェイスの実装は「ある」関係です。 Bird が Bird を継承する場合、fly インターフェースを実装するかどうかは、この機能 (動作) があるかどうかによってのみ決まります。
2) 抽象クラスはテンプレート設計であり、インターフェイスは動作仕様と放射状設計です。
たとえば、同じメソッドの場合、抽象クラス テンプレート設計を使用した後、メソッドを変更する場合は、テンプレート内で変更するだけでよく、インターフェース ラジアル デザインを使用した後、すべてのサブクラスを更新できます。メソッドを更新するには、すべての実装クラスを互いに独立して変更する必要があります。
2 つの接続は
1 を使用します。インターフェースが継承されている場合は、インターフェースも継承する必要があります。達成できません。抽象クラスは継承できません
2. 抽象クラスはインターフェイスを実装でき、抽象クラスを継承できますが、インターフェイスを継承することはできません