インターフェイスの本質 - インターフェイスは特別な抽象クラスであり、変数やメソッドの実装を含まず、定数とメソッドの定義のみが含まれます。
インターフェイスには、抽象クラスが持ついくつかのものを持つことができます。抽象クラス内のすべてのメソッドが抽象である場合、この抽象クラスによって実装されるメソッドはなく、この抽象クラス内のすべての変数は静的変数になります。このとき、そのような抽象クラスをインターフェースとして定義することができます。クラスをインターフェースとして定義する形式は、クラスを宣言するキーワード class を、インターフェースを宣言するキーワードinterface に置き換えます。
インターフェースは特別な抽象クラスであり、この抽象クラスではすべてのメソッドが抽象メソッドであり、この抽象クラスの属性 (つまりメンバー変数) は「public static Final type 属性名」として宣言されます。このように、デフォルトの宣言は次のようになります。 「public staticfinal」。つまり、内部のメンバー変数はパブリックで静的であり、変更できません。したがって、インターフェース内で定数を宣言する場合は、「public static Final 型定数名=値(値)」の形式で記述することもできますし、「型定数名=値(値)」の形式で直接記述することもできます。 )" のような: "public static Final int id =10" は、"int id=10" の形式で直接記述することができます。インターフェイス内のデフォルトのプロパティ宣言はすべて "public static Final" であるため、"public static Final 」は省略可能です。インターフェイスで宣言された抽象メソッドは、abstract キーワードで識別する必要はありません。インターフェイス内のすべてのメソッドは抽象であるため、たとえば、インターフェイスでそのような 3 つの単語を宣言した場合、「abstract」キーワードはデフォルトで省略されます。 , メソッド:「public void start()」、「public void run()」、「public void」 「stop()」は、これら 3 つのメソッドの前にある抽象キーワードによって識別されませんが、インターフェイスで宣言されたメソッドはすべて抽象メソッドであるため、これらは抽象メソッドです。そのため、次の抽象メソッドでは抽象キーワードが省略されます。デフォルトで宣言されたメソッドは抽象メソッドであるため、削除されました。これは、抽象クラスで抽象メソッドを宣言する場合とは異なり、「abstract」キーワードを使用する必要があり、インターフェイスでは「」を省略できます。抽象メソッドを宣言する場合は「abstract」を使用します。注: インターフェイスで宣言される抽象メソッドはデフォルトで "public" であり、"public" のみにすることができます。これは、C++ で多重継承が発生した場合に発生しやすい問題を修正するためです。 C++ では問題が発生しやすいのですが、多重継承の親クラスが同じメンバ変数を持つと、それらを参照するのが非常に面倒になり、動作中にさまざまな問題が発生します。この問題を修正するために、JAVA はインターフェイス内のすべてのメンバー変数を静的 Final に変更しました。メンバー変数が静的型の場合、そのメンバー変数は特定のオブジェクトに限定されるのではなく、クラス全体に属します。多重継承の場合、サブクラス オブジェクトには実際に複数の親クラス オブジェクトが含まれますが、単一継承の場合、サブクラス オブジェクトには親クラス オブジェクトが 1 つだけ存在します。多重継承されたサブクラス オブジェクトには複数の親クラス オブジェクトがあり、これらの親クラス オブジェクト間に重複するメンバー変数が存在する可能性があり、問題が発生しやすいため、JAVA では多重継承を実装するインターフェイスを使用することでこの問題を回避できます。インターフェイスとして、クラスはインターフェイスを継承できます (またはインターフェイスを実装できます)。これも多重継承です。インターフェイス内のメンバー変数はすべて静的メンバー変数であり、クラス全体に属します。したがって、クラスが複数のインターフェイスを実装しても問題はなく、オブジェクト間で競合は発生しません。複数のインターフェイスを実装すると、多重継承も実現され、多重継承に発生しやすい問題が回避されます。これは、インターフェイスを使用して多重継承を実装することの利点です。
1. インターフェースを定義する
インターフェイスを定義するには、インターフェイスを使用します。インターフェイス定義も同様の定義で、インターフェイス宣言とインターフェイス本体は定数定義とメソッド定義の 2 つの部分で構成されます。インターフェイスを定義するための基本的な形式は次のとおりです。
[修飾子] インターフェイス インターフェイス名 [親インターフェイス名のリストを拡張]{
[パブリック] [静的] [最終] 定数。
[パブリック] [抽象] メソッド;
}
修飾子: オプション。インターフェイスのアクセス許可を指定するために使用されます。オプションの値は public です。省略した場合は、デフォルトのアクセス許可が使用されます。
インターフェイス名: インターフェイスの名前を指定するために使用される必須パラメータ。インターフェイス名は有効な Java 識別子である必要があります。通常、大文字が必要です。
extends: 親インターフェイス名リスト: 定義されるインターフェイスがどの親インターフェイスから継承するかを指定するために使用されるオプションのパラメーター。 extends キーワードを使用する場合、親インターフェイス名は必須パラメータです。
メソッド: インターフェイス内のメソッドは定義されているだけで、実装されていません。
たとえば、定数 PI と 2 つのメソッドが定義された計算用のインターフェイスを定義します。具体的なコードは次のとおりです。
public Interface CalInterface {final float PI=3.14159f;//円周率を表すために使用する定数 PI を定義 float getArea(float r);//面積を計算するメソッドを定義 getArea() float getCircumference(float r);//外周を計算するメソッド getCircumference() }
知らせ:
Java のクラス ファイルと同様、インターフェイス ファイルのファイル名はインターフェイス名と同じである必要があります。
2. インターフェースを実装する
インターフェイスを定義したら、クラスに実装できます。クラスにインターフェイスを実装するには、キーワードimplementsを使用できます。その基本形式は次のとおりです。
[修飾子] class <クラス名> [親クラス名を拡張] [インターフェイスリストを実装]{
......
}
修飾子: クラスのアクセス許可を指定するために使用されるオプションのパラメーター。オプションの値は public、abstract、final です。
クラス名: クラスの名前を指定するために使用される必須パラメータ。クラス名は有効な Java 識別子である必要があります。通常、大文字は必須です。
extends 親クラス名: 定義するクラスがどの親クラスから継承するかを指定するために使用されるオプションのパラメータ。 extends キーワードを使用する場合、親クラス名は必須パラメーターです。
implements インターフェイス リスト: このクラスが実装するインターフェイスを指定するために使用されるオプションのパラメーター。 implements キーワードを使用する場合、インターフェイス リストは必須パラメータです。インターフェースリストに複数のインターフェース名がある場合は、カンマで区切って指定します。
クラスにインターフェイスを実装する場合、メソッド名、戻り値の型、パラメータの数と型がインターフェイスのものとまったく同じである必要があり、インターフェイス内のすべてのメソッドが実装されている必要があります。たとえば、セクション 5.7.1 で定義されている Calculate インターフェイスを実装する Cire という名前のクラスを作成します。具体的なコードは次のとおりです。
public class Cireimplements CalInterface { public float getArea(float r) { float area=PI*r*r;//円の面積を計算し、変数 area に代入します return area;//計算された円の面積を返します} public float getCircumference (float r) { float around=2*PI*r; //円の円周を計算し、それを変数円周に代入します return 円周を返します } public static void main(String[] args) { Cire c = new Cire(); float f = c.getArea(2.0f);
クラスの継承では単一の継承しかできませんが、インターフェイスを実装する場合は複数のインターフェイスを一度に実装でき、各インターフェイスはカンマ「,」で区切られます。
このとき、定数名またはメソッド名の競合(複数のインターフェイス間)が発生する可能性があります。この問題を解決する場合、定数のインターフェイスを明示的に指定する必要があります。これは、「インターフェイス名.定数」によって実現できます。メソッドの競合が発生した場合、実装する必要があるメソッドは 1 つだけです。