インターフェース (Java)

フリー百科事典ウィキペディアより

Java プログラミング言語インターフェースは、クラスが実装する必要がある動作を宣言するために使用される抽象型ですそれらはプロトコルに似ていますインターフェイスはキーワードを使用して宣言され、メソッド シグネチャと定数宣言 (と の両方であると宣言される変数宣言) のみを含めることができます。Java 8 より前のすべてのバージョンでは、Interface のすべてのメソッドに実装 (メソッド本体) が含まれているわけではありません。Java 8 以降では、メソッドの定義に実装が含まれる場合があります[1]次に、Java 9 ではinterface staticfinaldefaultstaticinterfaceprivateprivate staticメソッドが追加されました。現在、Java インターフェースは最大 6 つの異なるタイプを持つことができます。

インターフェイスはインスタンス化できず、実装されます。インターフェイスを実装するクラスは、インターフェイスに記述されているデフォルト以外のメソッドをすべて実装するか、抽象クラスにする必要があります。Java のオブジェクト参照は、インターフェイス タイプとして指定できます。いずれの場合も、それらはnullであるか、インターフェイスを実装するオブジェクトにバインドされている必要があります。

インターフェイスを使用する利点の 1 つは、多重継承をシミュレートできることですJava のすべてのクラスには、1 つの基本クラスが必要です。唯一の例外はjava.lang.Object( Java型システムのルート クラス) です。クラスの多重継承は許可されていません。ただし、インターフェイスは複数のインターフェイスを継承する場合があり、クラスは複数のインターフェイスを実装する場合があります。

概要

インターフェイスは、さまざまなタイプのクラスが共有する類似性をエンコードするために使用されますが、必ずしもクラス関係を構成するわけではありません。たとえば、人間オウムはどちらも口笛を吹くことができます。Humanただし、 およびをクラスParrotのサブクラスとして表現しても意味がありませんWhistlerむしろ、それらはAnimalクラスのサブクラスである可能性が最も高いですが (中間クラスを持つ可能性が高い)、どちらもインターフェースを実装しますWhistler

インターフェースのもう 1 つの用途は、クラスの型を知らなくてもオブジェクトを使用できることですが、特定のインターフェースを実装しているということだけです。たとえば、口笛の音に悩まされた場合、それが人間なのかオウムなのかわからなくなることがあります。呼び出しは、実装されている場合、オブジェクトのクラスに関係なく、オブジェクトの実装されたwhistler.whistle()メソッドを呼び出しますより実用的な例では、ソート アルゴリズムはtype のオブジェクトを予期する場合がありますしたがって、特定のタイプを知らなくても、そのタイプのオブジェクトを何らかの方法でソートできることがわかります。 whistlewhistlerWhistlerComparable

例えば:

インターフェイス Bounceable  {
    二重 pi  =  3.1415 ; 
    ボイド setBounce ();   // セミコロンに注意してください
                       
                       // それらは単なるプロトタイプと考えてください。実装は許可されていません。
}

インターフェース:

  • メソッド ヘッダーとパブリック定数のみを宣言します。
  • インスタンス化できません。
  • クラスで実装できます。
  • クラスを拡張することはできません。
  • 他のいくつかのインターフェースを拡張できます。

使い方

インターフェイスの定義

インターフェイスは次の構文で定義されます ( Java のクラス定義と比較してください)。

[可視性] インターフェイスInterfaceName [他のインターフェイスを拡張] {
        定数宣言
        抽象メソッド宣言
        静的メソッド宣言
}

例: パブリック インターフェイス Interface1 は Interface2 を拡張します。

インターフェースの本体には抽象メソッドが含まれていますが、インターフェース内のすべてのメソッドは定義により抽象であるため、abstractキーワードは必要ありません。インターフェイスは一連の公開された動作を指定するため、すべてのメソッドは暗黙的にpublic.

したがって、単純なインターフェースは

public  interface  Predator  { 
    boolean チェイスプレイ(獲物 p ); 
    void  eatPrey (獲物 p ); 
}

インターフェイスのメンバー型宣言は、暗黙的に static、final、および public ですが、それ以外の場合は、任意の型のクラスまたはインターフェイスにすることができます。[2]

クラスにインターフェースを実装する

インターフェイスを実装するための構文は、次の式を使用します。

... InterfaceName [、別のインターフェイス別の、...] を実装します ...

クラスはインターフェースを実装できます。例えば:

public  class  Lion は プレデターを実装します { 

    @Override 
    public  boolean  ChasePrey ( Prey  p )  { 
           // 獲物 p を追跡するためのプログラミング (特にライオンの場合) 
    }

    @Override 
    public  void  eatPrey ( Prey  p )  { 
           // 獲物 p を食べるプログラミング (特にライオン用) 
    } 
}

クラスがインターフェイスを実装し、そのすべてのメソッドを実装していない場合は、 としてマークする必要がありますabstractクラスが抽象クラスの場合、そのサブクラスの 1 つが実装されていないメソッドを実装することが期待されますが、抽象クラスのサブクラスのいずれかがすべてのインターフェイス メソッドを実装していない場合、サブクラス自体を再び としてマークする必要がありますabstract

クラスは複数のインターフェースを実装できます。

public  class  Frog は Predator Prey { ... }を実装しています     

インターフェイスは共通のクラス メソッドを共有できます。

class  Animal は LikesFood LikesWater { boolean likes () { return true ; }を実装しています。 } }  
         

ただし、特定のクラスは、同じまたは類似のインターフェースを複数回実装することはできません。

class  Animal  implements  Shares < Boolean > ,  Shares < Integer >  ... 
// エラー: インターフェースの繰り返し

Java ではクラスの多重継承が許可されておらず、引数としてメソッド (プロシージャー) を渡すことも許可されていないため、Java言語では一般的にインターフェイスがコールバックに使用されます[3] 。したがって、メソッドをパラメーターとしてターゲット メソッドに渡すために、現在の慣行は、複数のバリアントを定義するのではなく、パラメーター メソッドのシグネチャとアドレスをターゲット メソッドに提供する手段として、インターフェイスへの参照を定義して渡すことです。可能性のある各呼び出しクラスに対応するためのターゲット メソッドの。

サブインターフェース

インターフェイスは、以下で説明するのと同じ式を使用して、他のいくつかのインターフェイスを拡張できます。例えば、

public  interface  VenomousPredator  extends  Predator ,  Venomous  { 
    // インターフェース本体
}

正当であり、サブインターフェイスを定義します。クラスとは異なり、多重継承が可能です。Predatorまた、Venomous同じシグネチャを持つメソッドを定義または継承する可能性がありますkill(Prey p)クラスが実装すると、VenomousPredator両方のメソッドが同時に実装されます。

いくつかの一般的なJavaインターフェースは次のとおりです。

も参照

参考文献

  1. ^ "デフォルトのメソッド" . 2017-05-23 のオリジナルからのアーカイブ2014 年 6 月 30 日閲覧
  2. ^ "Java 言語仕様" .
  3. ^ ミッチェル、ジョン D. (1996 年 6 月 1 日)。「Java ヒント 10: Java でコールバック ルーチンを実装する」 . ジャバワールド2020-07-14取得

外部リンク