logo

Java のインターフェース

アン Javaのインターフェース プログラミング言語は、クラスの動作を指定するために使用される抽象型として定義されます。 Java のインターフェイスは動作の設計図です。 Java インターフェイスには、静的定数と抽象メソッドが含まれています。

Javaのインターフェースとは何ですか?

Javaのインターフェースは、 ある 実現する仕組み 抽象化 。 Java インターフェースには抽象メソッドのみを含めることができ、メソッド本体には含めることはできません。抽象化を達成するために使用され、 インターフェイスを使用した Java での多重継承 。言い換えれば、インターフェイスには抽象メソッドと変数を含めることができると言えます。メソッド本体を持つことはできません。 Javaインターフェースも IS-A関係を表します

属性ではなく、その動作によってエンティティのタイプを決定する場合、それをインターフェイスとして定義する必要があります。



Java インターフェースの構文

interface {  // declare constant fields  // declare methods that abstract   // by default.  }>

インターフェイスを宣言するには、interface キーワードを使用します。完全な抽象化を提供するために使用されます。つまり、インターフェイス内のすべてのメソッドは空の本体で宣言され、パブリックであり、すべてのフィールドはデフォルトで public、static、final になります。インターフェイスを実装するクラスは、インターフェイスで宣言されたすべてのメソッドを実装する必要があります。インターフェイスを実装するには、implements キーワードを使用します。

Java でのインターフェイスの使用

Java でのインターフェイスの使用については以下で説明します。

  • 完全な抽象化を達成するために使用されます。
  • Javaはクラスの場合は多重継承をサポートしていないため、インターフェースを利用することで多重継承を実現できます。
  • どのクラスでも拡張できるクラスは 1 つだけですが、どのクラスでも無限の数のインターフェイスを実装できます。
  • 疎結合を実現するためにも使用されます。
  • インターフェイスは抽象化を実装するために使用されます。

それでは、抽象クラスがあるのになぜインターフェイスを使用するのかという疑問が生じます。

その理由は、抽象クラスには非final変数が含まれる可能性があるのに対し、インターフェイス内の変数はfinal、public、staticであるためです。

// A simple interface interface Player {  final int id = 10;  int move(); }>

クラスとインターフェースの関係

インターフェイスが別のインターフェイスを拡張できるのと同様に、クラスは別のクラスを拡張できます。ただし、別のインターフェイスに拡張できるのはクラスのみであり、その逆は許可されません。

クラスとインターフェイスの違い

クラスとインターフェイスは同じように見えますが、クラスとインターフェイスの間には特定の違いがあります。クラスとインターフェイスの主な違いを以下に示します。

クラス

インターフェース

クラスでは、変数をインスタンス化し、オブジェクトを作成できます。インターフェイスでは、変数をインスタンス化してオブジェクトを作成することはできません。
クラスには具体的な (実装を含む) メソッドを含めることができますインターフェイスには、具体的な (実装を含む) メソッドを含めることはできません。
クラスで使用されるアクセス指定子は、private、protected、および public です。インターフェイスでは、Public という 1 つの指定子のみが使用されます。

実装: インターフェースを実装するには、キーワードを使用します 実装する

ジャワ
// Java program to demonstrate working of // interface import java.io.*; // A simple interface interface In1 {    // public, static and final  final int a = 10;  // public and abstract  void display(); } // A class that implements the interface. class TestClass implements In1 {    // Implementing the capabilities of  // interface.  public void display(){   System.out.println('Geek');   }  // Driver Code  public static void main(String[] args)  {  TestClass t = new TestClass();  t.display();  System.out.println(t.a);  } }>

出力
Geek 10>

Java インターフェースの例

共通の機能を持つ自転車、車、バイクなどの乗り物の例を考えてみましょう。そこでインターフェースを作成し、これらの共通機能をすべて組み込みます。そして、Bicycle、Bike、car などにこれらすべての機能を独自の方法で独自のクラスに実装させます。

以下は、上記のトピックの実装です。

ジャワ
// Java program to demonstrate the  // real-world example of Interfaces import java.io.*; interface Vehicle {    // all are the abstract methods.  void changeGear(int a);  void speedUp(int a);  void applyBrakes(int a); } class Bicycle implements Vehicle{    int speed;  int gear;    // to change gear  @Override  public void changeGear(int newGear){    gear = newGear;  }    // to increase speed  @Override  public void speedUp(int increment){    speed = speed + increment;  }    // to decrease speed  @Override  public void applyBrakes(int decrement){    speed = speed - decrement;  }    public void printStates() {  System.out.println('speed: ' + speed  + ' gear: ' + gear);  } } class Bike implements Vehicle {    int speed;  int gear;    // to change gear  @Override  public void changeGear(int newGear){    gear = newGear;  }    // to increase speed  @Override  public void speedUp(int increment){    speed = speed + increment;  }    // to decrease speed  @Override  public void applyBrakes(int decrement){    speed = speed - decrement;  }    public void printStates() {  System.out.println('speed: ' + speed  + ' gear: ' + gear);  }   } class GFG {    public static void main (String[] args) {    // creating an instance of Bicycle  // doing some operations  Bicycle bicycle = new Bicycle();  bicycle.changeGear(2);  bicycle.speedUp(3);  bicycle.applyBrakes(1);    System.out.println('Bicycle present state :');  bicycle.printStates();    // creating instance of the bike.  Bike bike = new Bike();  bike.changeGear(1);  bike.speedUp(4);  bike.applyBrakes(3);    System.out.println('Bike present state :');  bike.printStates();  } }>

出力
Bicycle present state : speed: 2 gear: 2 Bike present state : speed: 1 gear: 1>

Java のインターフェースの利点

Java でインターフェースを使用する利点は次のとおりです。

  • 実装部分を気にすることなく、実装のセキュリティを実現できます。
  • Java では多重継承は許可されていませんが、複数のインターフェイスを実装できるため、インターフェイスを使用してそれを利用できます。

インターフェイスを使用した Java での多重継承

多重継承は OOP の概念であり、クラスを使用して Java に実装することはできません。ただし、Java では Interface を使用して複数の継承を使用できます。これを例で確認してみましょう。

例:

ジャワ
// Java program to demonstrate How Diamond Problem // Is Handled in case of Default Methods // Interface 1 interface API {  // Default method  default void show()  {  // Print statement  System.out.println('Default API');  } } // Interface 2 // Extending the above interface interface Interface1 extends API {  // Abstract method  void display(); } // Interface 3 // Extending the above interface interface Interface2 extends API {  // Abstract method  void print(); } // Main class // Implementation class code class TestClass implements Interface1, Interface2 {  // Overriding the abstract method from Interface1  public void display()  {  System.out.println('Display from Interface1');  }  // Overriding the abstract method from Interface2  public void print()  {  System.out.println('Print from Interface2');  }  // Main driver method  public static void main(String args[])  {  // Creating object of this class  // in main() method  TestClass d = new TestClass();  // Now calling the methods from both the interfaces  d.show(); // Default method from API  d.display(); // Overridden method from Interface1  d.print(); // Overridden method from Interface2  } }>

出力
Default API>

JDK 8のインターフェースに追加された新機能

以下に示す JDK 8 アップデートのインターフェースに特定の機能が追加されました。

1. JDK 8 より前では、インターフェースで実装を定義できませんでした。インターフェイス メソッドのデフォルト実装を追加できるようになりました。このデフォルトの実装には特別な用途があり、インターフェイスの背後にある意図には影響しません。

既存のインターフェースに新しい関数を追加する必要があるとします。明らかに、クラスには新しい関数が実装されていないため、古いコードは機能しません。そこで、デフォルトの実装を利用して、新しく追加された関数にデフォルトの本体を与えます。その後、古いコードは引き続き機能します。

以下は上記の点の実装です。

ジャワ
// Java program to show that interfaces can // have methods from JDK 1.8 onwards interface In1 {  final int a = 10;  default void display()  {  System.out.println('hello');  } } // A class that implements the interface. class TestClass implements In1 {  // Driver Code  public static void main (String[] args)  {  TestClass t = new TestClass();  t.display();  } }>

出力
hello>

2. JDK 8 で追加されたもう 1 つの機能は、オブジェクトなしで独立して呼び出すことができる静的メソッドをインターフェイスで定義できることです。

注記: これらのメソッドは継承されません。

ジャワ
// Java Program to show that interfaces can // have methods from JDK 1.8 onwards interface In1 {  final int a = 10;  static void display()  {  System.out.println('hello');  } } // A class that implements the interface. class TestClass implements In1 {  // Driver Code  public static void main (String[] args)  {  In1.display();  } }>

出力
hello>

インターフェースの拡張

キーワード extends を使用すると、あるインターフェイスが別のインターフェイスを継承できます。クラスが別のインターフェイスを継承するインターフェイスを実装する場合、そのクラスはインターフェイス継承チェーンで必要なすべてのメソッドの実装を提供する必要があります。

プログラム 1:

ジャワ
interface A {  void method1();  void method2(); } // B now includes method1 and method2 interface B extends A {  void method3(); } // the class must implement all method of A and B. class gfg implements B {  public void method1()  {  System.out.println('Method 1');  }  public void method2()  {  System.out.println('Method 2');  }  public void method3()  {  System.out.println('Method 3');  } }>

プログラム 2:

ジャワ
interface Student  {  public void data();   } class avi implements Student {  public void data ()  {  String name='avinash';  int rollno=68;  System.out.println(name);  System.out.println(rollno);  } } public class inter_face  {  public static void main (String args [])  {  avi h= new avi();  h.data();  } }>

出力
avinash 68>

簡単に言うと、インターフェイスには複数の抽象メソッドが含まれているため、実装クラスで実装を記述します。実装がすべての抽象メソッドの実装を提供できない場合は、抽象修飾子を使用して実装クラスを宣言し、次に作成される子クラスで残りのメソッドの実装を完了します。複数の子クラスを宣言することは可能ですが、最終的にすべての抽象メソッドの実装が完了しました。

ライオンとトラの違い

一般に、開発プロセスは段階的に行われます。

レベル1 – インターフェイス: サービスの詳細が含まれます。
レベル2 – 抽象クラス: 部分的な実装が含まれます。
レベル3 – 実装クラス: すべての実装が含まれます。
レベル4 – 最終コード / メイン メソッド: すべてのインターフェイス データにアクセスできます。

例:

ジャワ
// Java Program for // implementation Level wise import java.io.*; import java.lang.*; import java.util.*; // Level 1 interface Bank {  void deposit();  void withdraw();  void loan();  void account(); } // Level 2 abstract class Dev1 implements Bank {  public void deposit()  {  System.out.println('Your deposit Amount :' + 100);  } } abstract class Dev2 extends Dev1 {  public void withdraw()  {  System.out.println('Your withdraw Amount :' + 50);  } } // Level 3 class Dev3 extends Dev2 {  public void loan() {}  public void account() {} } // Level 4 class GFG {  public static void main(String[] args)  {  Dev3 d = new Dev3();  d.account();  d.loan();  d.deposit();  d.withdraw();  } }>

出力
Your deposit Amount :100 Your withdraw Amount :50>

JDK 9のインターフェースに追加された新機能

Java 9 以降、インターフェイスには次のものも含めることができます。

  1. 静的メソッド
  2. プライベートメソッド
  3. プライベート静的メソッド

Javaインターフェースの注意点

この記事では、以下に示すインターフェイスに関する重要なポイントを学びます。

  • インターフェースのインスタンスを作成することはできません (インターフェースをインスタンス化することはできません) が、その実装クラスのオブジェクトを参照するその参照を作成することはできます。
  • クラスは複数のインターフェイスを実装できます。
  • インターフェイスは、別のインターフェイスまたはインターフェイス (複数のインターフェイス) に拡張できます。
  • インターフェイスを実装するクラスは、インターフェイス内のすべてのメソッドを実装する必要があります。
  • すべてのメソッドはパブリックかつ抽象です。すべてのフィールドは public、static、final です。
  • 多重継承を実現するために使用されます。
  • 疎結合を実現するために使用されます。
  • インターフェイス内ではインスタンス変数を宣言できません。デフォルトでは変数が パブリックスタティックファイナル。
  • インターフェイス内では、コンストラクターは許可されません。
  • インターフェイス内では main メソッドは許可されません。
  • インターフェイス内では、static、final、private メソッドの宣言はできません。

必読

インターフェースに関するよくある質問

1. マーカーまたはタグ付きインターフェイスとは何ですか?

タグ付きインターフェイスは、機能を持たずにマーカーとして機能するメソッドを持たないインターフェイスです。

2. Java にはインターフェースの種類が何種類ありますか?

Java のインターフェイスの種類を以下に示します。

  1. 機能インターフェース
  2. マーカーインターフェース

3. Java のクラスでは多重継承がサポートされていないのはなぜですか?

曖昧さやダイアモンドの問題などの特定の課題を回避するために、Java のクラスでは多重継承がサポートされていません。