Java-interfaces

提供:Dev Guides
移動先:案内検索

Java-インターフェース

インターフェイスは、Javaの参照型です。 クラスに似ています。 これは抽象メソッドの集まりです。 クラスはインタフェースを実装し、それによってインタフェースの抽象メソッドを継承します。

抽象メソッドに加えて、インタフェースには定数、デフォルトメソッド、静的メソッド、およびネストされた型も含まれる場合があります。 メソッド本体は、デフォルトメソッドと静的メソッドに対してのみ存在します。

インターフェイスの記述は、クラスの記述に似ています。 ただし、クラスはオブジェクトの属性と動作を記述します。 また、インターフェイスには、クラスが実装する動作が含まれます。

インターフェイスを実装するクラスが抽象クラスでない限り、インターフェイスのすべてのメソッドをクラスで定義する必要があります。

インターフェイスは、次の点でクラスに似ています-

  • インターフェイスには、任意の数のメソッドを含めることができます。
  • インターフェースは、拡張子が .java のファイルに書き込まれ、インターフェースの名前はファイルの名前と一致します。
  • インターフェイスのバイトコードは、*。class *ファイルに表示されます。
  • インターフェイスはパッケージに表示され、対応するバイトコードファイルは、パッケージ名と一致するディレクトリ構造に存在する必要があります。

ただし、インターフェイスは、次のようないくつかの点でクラスとは異なります-

  • インターフェイスをインスタンス化することはできません。
  • インターフェイスにはコンストラクタが含まれていません。
  • インターフェイス内のすべてのメソッドは抽象的です。
  • インターフェイスにインスタンスフィールドを含めることはできません。 インターフェイスに表示できるフィールドは、静的と最終の両方で宣言する必要があります。
  • インターフェイスはクラスによって拡張されません。クラスによって実装されます。
  • インターフェースは複数のインターフェースを拡張できます。

インターフェイスの宣言

*interface* キーワードは、インターフェイスを宣言するために使用されます。 これは、インターフェイスを宣言する簡単な例です-

以下は、インターフェイスの例です-

/*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 キーワードを使用する必要はありません。
  • インターフェイス内の各メソッドも暗黙的に抽象的であるため、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つのクラスのみを拡張できますが、多くのインターフェイスを実装します。 *クラスが別のクラスを拡張できるように、インターフェイスは別のインターフェイスを拡張できます。

インターフェースの拡張

インターフェイスは、クラスが別のクラスを拡張できるのと同じ方法で、別のインターフェイスを拡張できます。* extends *キーワードはインターフェイスを拡張するために使用され、子インターフェイスは親インターフェイスのメソッドを継承します。

次のスポーツインターフェイスは、ホッケーとサッカーのインターフェイスによって拡張されています。

//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回使用され、親インターフェイスはコンマ区切りリストで宣言されます。

たとえば、ホッケーインターフェイスがスポーツとイベントの両方を拡張した場合、次のように宣言されます-

public interface Hockey extends Sports, Event

インターフェイスのタグ付け

拡張インターフェイスの最も一般的な使用方法は、親インターフェイスにメソッドが含まれていない場合に発生します。 たとえば、java.awt.eventパッケージのMouseListenerインターフェイスは、次のように定義されているjava.util.EventListenerを拡張しました-

package java.util;
public interface EventListener
{}

メソッドを持たないインターフェースは、 tagging インターフェースと呼ばれます。 インターフェイスのタグ付けには2つの基本的な設計目的があります-

共通の親を作成します-Java APIの他の多数のインターフェースによって拡張されるEventListenerインターフェースと同様に、タグ付けインターフェースを使用して、インターフェースのグループ間で共通の親を作成できます。 たとえば、インターフェイスがEventListenerを拡張すると、JVMはこの特定のインターフェイスがイベント委任シナリオで使用されることを認識します。

データ型をクラスに追加します-この状況は、タギングという用語の由来です。 タグ付けインターフェースを実装するクラスは、メソッドを定義する必要はありませんが(インターフェースには何もないため)、クラスはポリモーフィズムによってインターフェース型になります。