Java-インターフェース
インターフェイスは Java の参照型です。クラスに似ています。抽象メソッドの集まりです。クラスはインターフェースを実装することで、インターフェースの抽象メソッドを継承します。
抽象メソッドに加えて、インターフェイスには、定数、既定のメソッド、静的メソッド、および入れ子になった型も含まれる場合があります。メソッド本体は、デフォルト メソッドと静的メソッドに対してのみ存在します。
インターフェイスの作成は、クラスの作成に似ています。しかし、クラスはオブジェクトの属性と動作を記述します。インターフェイスには、クラスが実装する動作が含まれます。
インターフェイスを実装するクラスが抽象クラスでない限り、インターフェイスのすべてのメソッドをクラスで定義する必要があります。
インターフェイスは、次の点でクラスに似ています-
- <リ>
インターフェイスには、任意の数のメソッドを含めることができます。
<リ>インターフェースは .java を含むファイルに書き込まれます ファイルの名前と一致するインターフェイスの名前を持つ拡張子。
<リ>インターフェイスのバイト コードは .class に表示されます ファイル。
<リ>インターフェイスはパッケージに表示され、対応するバイトコード ファイルは、パッケージ名と一致するディレクトリ構造にある必要があります。
ただし、インターフェイスは、以下を含むいくつかの点でクラスとは異なります-
- <リ>
インターフェイスをインスタンス化することはできません。
<リ>インターフェースにコンストラクターが含まれていません。
<リ>インターフェイスのメソッドはすべて抽象的です。
<リ>インターフェイスにインスタンス フィールドを含めることはできません。インターフェイスに表示できる唯一のフィールドは、static と final の両方で宣言する必要があります。
<リ>インターフェイスはクラスによって拡張されません。クラスによって実装されます。
<リ>インターフェースは複数のインターフェースを拡張できます。
インターフェースの宣言
インターフェース キーワードは、インターフェイスを宣言するために使用されます。インターフェイスを宣言する簡単な例を次に示します −
例
以下はインターフェースの例です −
/* File name : NameOfInterface.java */ import java.lang.*; // Any number of import statements public interface NameOfInterface { // Any number of final, static fields // Any number of abstract method declarations\ }
インターフェイスには次のプロパティがあります-
- <リ>
インターフェイスは暗黙のうちに抽象的です。 アブストラクトを使用する必要はありません インターフェイス宣言中のキーワード。
<リ>インターフェースの各メソッドも暗黙のうちに抽象的であるため、abstract キーワードは必要ありません。
<リ>インターフェイスのメソッドは暗黙的に公開されます。
例
/* File name : Animal.java */ interface Animal { public void eat(); public void travel(); }
インターフェースの実装
クラスがインターフェースを実装するとき、クラスはコントラクトに署名し、インターフェースの特定の動作を実行することに同意するものと考えることができます。クラスがインターフェイスのすべての動作を実行しない場合、クラスは自分自身を抽象として宣言する必要があります。
クラスは implements を使用します インターフェイスを実装するためのキーワード。 implements キーワードは、宣言の extends 部分に続くクラス宣言に現れます。
例
/* File name : MammalInt.java */ public class MammalInt implements Animal { public void eat() { System.out.println("Mammal eats"); } public void travel() { System.out.println("Mammal travels"); } public int noOfLegs() { return 0; } public static void main(String args[]) { MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
これにより、次の結果が生成されます-
出力
Mammal eats Mammal travels
インターフェイスで定義されたメソッドをオーバーライドする場合、従うべきいくつかのルールがあります −
- <リ>
チェック例外は、インターフェイス メソッドによって宣言された実装メソッドまたはインターフェイス メソッドによって宣言されたサブクラス以外の実装メソッドで宣言されるべきではありません。
<リ>メソッドをオーバーライドするときは、インターフェイス メソッドのシグネチャと同じ戻り値の型またはサブタイプを維持する必要があります。
<リ>実装クラス自体は抽象化できます。抽象化する場合、インターフェース メソッドを実装する必要はありません。
実装インターフェースの場合、いくつかのルールがあります −
- <リ>
クラスは一度に複数のインターフェースを実装できます。
<リ>クラスは 1 つのクラスのみを拡張できますが、多くのインターフェースを実装できます。
<リ>クラスが別のクラスを拡張できるのと同様の方法で、インターフェースは別のインターフェースを拡張できます。
インターフェースの拡張
クラスが別のクラスを拡張できるのと同じ方法で、インターフェイスは別のインターフェイスを拡張できます。 延長 キーワードはインターフェースを拡張するために使用され、子インターフェースは親インターフェースのメソッドを継承します。
以下の Sports インターフェースは、Hockey および Football インターフェースによって拡張されています。
例
// Filename: Sports.java public interface Sports { public void setHomeTeam(String name); public void setVisitingTeam(String name); } // Filename: Football.java public interface Football extends Sports { public void homeTeamScored(int points); public void visitingTeamScored(int points); public void endOfQuarter(int quarter); } // Filename: Hockey.java public interface Hockey extends Sports { public void homeGoalScored(); public void visitingGoalScored(); public void endOfPeriod(int period); public void overtimePeriod(int ot); }
Hockey インターフェイスには 4 つのメソッドがありますが、Sports から 2 つ継承しています。したがって、Hockey を実装するクラスは、6 つのメソッドすべてを実装する必要があります。同様に、Football を実装するクラスは、Football の 3 つのメソッドと Sports の 2 つのメソッドを定義する必要があります。
複数のインターフェースの拡張
Java クラスは、1 つの親クラスのみを拡張できます。多重継承は許可されていません。ただし、インターフェイスはクラスではなく、インターフェイスは複数の親インターフェイスを拡張できます。
extends キーワードが 1 回使用され、親インターフェイスがコンマ区切りのリストで宣言されます。
たとえば、Hockey インターフェイスが Sports と Event の両方を拡張した場合、次のように宣言されます −
例
public interface Hockey extends Sports, Event
タグ付けインターフェース
インターフェイスを拡張する最も一般的な用途は、親インターフェイスにメソッドが含まれていない場合です。たとえば、java.awt.event パッケージの MouseListener インターフェイスは、次のように定義されている java.util.EventListener を拡張しました。
例
package java.util; public interface EventListener {}
メソッドを持たないインターフェースは タグ付け と呼ばれます インターフェース。タグ付けインターフェースの基本的な設計目的は 2 つあります −
共通の親を作成します − Java API の他の多数のインターフェースによって拡張される EventListener インターフェースと同様に、タグ付けインターフェースを使用して、インターフェースのグループ間で共通の親を作成できます。たとえば、インターフェースが EventListener を拡張する場合、JVM は、この特定のインターフェースがイベント委任シナリオで使用されることを認識します。
データ型をクラスに追加します − この状況がタグ付けという用語の由来です。タグ付けインターフェースを実装するクラスはメソッドを定義する必要はありませんが (インターフェースにはメソッドがないため)、クラスはポリモーフィズムによってインターフェース型になります。
Java