Javaインターフェース



インターフェース(英語: Interface )は、Java プログラミング言語において、抽象型および抽象メソッドの集合であり、インターフェースは通常、interface で宣言されます。クラスはインターフェイスを継承することで、インターフェイスの抽象メソッドを継承します。

インターフェイスはクラスではありません。インターフェイスの記述方法はクラスと非常に似ていますが、異なる概念に属します。クラスはオブジェクトのプロパティとメソッドを記述します。インターフェイスには、クラスが実装するメソッドが含まれています。

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

インターフェースはインスタンス化できませんが、実装することはできます。インターフェイスを実装するクラスは、インターフェイスに記述されているすべてのメソッドを実装する必要があります。それ以外の場合は、抽象クラスとして宣言する必要があります。さらに、Java では、インターフェイス型を使用して変数を宣言したり、ヌル ポインターにしたり、このインターフェイスを実装するオブジェクトにバインドしたりすることができます。

インターフェイスとクラスの類似点:

  • インターフェイスには複数のメソッドを含めることができます。

  • インターフェイス ファイルは .java で終わるファイルに保存され、ファイル名にはインターフェイス名が使用されます。

  • インターフェイスのバイトコード ファイルは、.class で終わるファイルに保存されます。

  • インターフェイスに対応するバイトコード ファイルは、パッケージ名と一致するディレクトリ構造内に存在する必要があります。

インターフェースとクラスの違い:
  • インターフェイスを使用してオブジェクトをインスタンス化することはできません。

  • インターフェイスにはコンストラクター メソッドがありません。

  • インターフェイス内のすべてのメソッドは抽象メソッドである必要があります。

  • インターフェイスには、静的変数と最終変数を除き、メンバー変数を含めることはできません。

  • インターフェイスはクラスによって継承されませんが、クラスによって実装されます。

  • インターフェイスは多重継承をサポートします。


インターフェースの宣言

インターフェースの宣言構文は次のとおりです:

[可见度] interface 接口名称 [extends 其他的类名] {
        // 声明变量
        // 抽象方法
}

Interfaceキーワードはインターフェースを宣言するために使用されます。以下は、インターフェイス宣言の簡単な例です。

/* 文件名 : NameOfInterface.java */
import java.lang.*;
//引入包

public interface NameOfInterface
{
   //任何类型 final, static 字段
   //抽象方法
}


インターフェースには次の機能があります:


  • インターフェイスは暗黙的に抽象です。インターフェイスを宣言する場合、abstract キーワードを使用する必要はありません。

  • インターフェイス内のすべてのメソッドも暗黙的に抽象であり、宣言時に abstract キーワードを必要としません。

  • インターフェイス内のすべてのメソッドはパブリックです。

インスタンス

/* 文件名 : Animal.java */
interface Animal {

   public void eat();
   public void travel();
}

インターフェースの実装

クラスがインターフェースを実装する場合、クラスはインターフェース内のすべてのメソッドを実装する必要があります。それ以外の場合は、クラスを抽象として宣言する必要があります。

クラスは、implements キーワードを使用してインターフェイスを実装します。クラス宣言では、Implements キーワードはクラス宣言の後に配置されます。

インターフェースの構文を実装するには、次の式を使用できます:

... implements 接口名称[, 其他接口, 其他接口..., ...] ...

Example

/* 文件名 : 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 キーワードが使用され、サブインターフェイスは親インターフェイスのメソッドを継承します。

次の Sports インターフェイスは、Hockey インターフェイスと Football インターフェイスによって継承されます。


// 文件名: Sports.java
public interface Sports
{
   public void setHomeTeam(String name);
   public void setVisitingTeam(String name);
}

// 文件名: Football.java
public interface Football extends Sports
{
   public void homeTeamScored(int points);
   public void visitingTeamScored(int points);
   public void endOfQuarter(int quarter);
}

// 文件名: 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 インターフェースを実装するクラスは 5 つのメソッドを実装する必要があり、そのうちの 2 つは Sports インターフェースからのものです。


インターフェースの多重継承

Javaではクラスの多重継承は違法ですが、インターフェースでは多重継承が許可されています。

インターフェイスの多重継承では、extends キーワードを 1 回だけ使用し、その後に継承されたインターフェイスを使用する必要があります。 以下に示すように:

public interface Hockey extends Sports, Event

上記のプログラムフラグメントは、法的に定義されたサブインターフェースです。クラスとは異なり、インターフェースは多重継承を許可しており、スポーツとイベントは同じメソッドを定義または継承する可能性があります


マークインターフェース

継承されたインターフェイスは、メソッドを含まないインターフェイスです。

識別インターフェイスは、メソッドやプロパティを持たないインターフェイスであり、そのクラスが他のコードがテストして何かを実行できるようにする特定のタイプに属していることを示すだけです。

識別インターフェースの機能: 簡単かつ明確に言うと、オブジェクトに特定の権限を持たせるためにオブジェクトにマーク (スタンプ) を付けることです。

例: java.awt.event パッケージの MouseListener インターフェースによって継承される java.util.EventListener インターフェースは次のように定義されます:

package java.util;
public interface EventListener
{}

メソッドのないインターフェースはマーカーインターフェースと呼ばれます。マーカー インターフェイスは、主に次の 2 つの目的で使用されます:

  • 共通の親インターフェイスを構築します:

    他の数十のインターフェイスによって拡張された Java API である EventListener インターフェイスと同様に、マーカー インターフェイスを使用して、 build 一連のインターフェイスの親インターフェイス。例: インターフェイスが EventListener インターフェイスを継承すると、Java 仮想マシン (JVM) は、そのインターフェイスがイベント プロキシ スキームに使用されることを認識します。

  • クラスにデータ型を追加します:

    この状況は、マーカー インターフェイスを実装するクラスはインターフェイス メソッドを定義する必要がありません (マーカー インターフェイスにはメソッドがないため)。まったく)、しかしクラスはポリモーフィズムを通過し、インターフェイス型になります。