Javaインターフェイス

1. 概要

このチュートリアルでは、Javaのインターフェースについて説明します。 また、Javaがポリモーフィズムと多重継承を実装するためにそれらをどのように使用するかについても説明します。

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

Javaでは、インターフェースはメソッドと定数変数のコレクションを含む抽象型です。 これはJavaの中核概念の1つであり、*抽象化を実現するために使用されます。https://www.baeldung.com/java-polymorphism [polymorphism]およびlink:/java-inheritance [複数の継承] ] *。
Javaのインターフェイスの簡単な例を見てみましょう。
public interface Electronic {

    // Constant variable
    String LED = "LED";

    // Abstract method
    int getElectricityUse();

    // Static method
    static boolean isEnergyEfficient(String electtronicType) {
        if (electtronicType.equals(LED)) {
            return true;
        }
        return false;
    }

    //Default method
    default void printDescription() {
        System.out.println("Electronic Description");
    }
}
_implements_キーワードを使用して、Javaクラスにインターフェイスを実装できます。
次に、作成した_Electronic_インターフェイスを実装する_Computer_クラスも作成しましょう。
public class Computer implements Electronic {

    @Override
    public int getElectricityUse() {
        return 1000;
    }
}

2.1. インターフェイス作成のルール

インターフェースでは、次のものを使用できます。
  • link:/java-final [定数変数]

  • abstract methods

  • link:/java-static-default-methods [静的メソッド]

  • link:/java-static-default-methods [デフォルトのメソッド]

    また、次のことも覚えておく必要があります。
  • インターフェースを直接インスタンス化することはできません

  • インターフェイスは空で、メソッドや変数は含まれません

  • インターフェース定義で_final_単語を使用することはできません。
    コンパイラエラーが発生します

  • すべてのインターフェイス宣言には、_public_またはデフォルトのアクセス権が必要です。
    修飾子; _abstract_修飾子はコンパイラーによって自動的に追加されます

  • インターフェイスメソッドは、private _、 protected_、または_final_にはできません。

  • インターフェイス変数は、定義により_public static_、および_final_です。
    可視性を変更することはできません

3. それらを使用して何を達成できますか?

3.1. 行動機能

インターフェイスを使用して、関連のないクラスで使用できる特定の動作機能を追加します。 たとえば、_Comparable _、_ Comparator_、および_Cloneable_は、無関係なクラスによって実装できるJavaインターフェイスです。 以下は、__ Employee __classの2つのインスタンスを比較するために使用される_Comparator_ interface__ ___の例です。
public class Employee {

    private double salary;

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}

public class EmployeeSalaryComparator implements Comparator<Employee> {

    @Override
    public int compare(Employee employeeA, Employee employeeB) {
        if (employeeA.getSalary() < employeeB.getSalary()) {
            return -1;
        } else if (employeeA.getSalary() > employeeB.getSalary()) {
            return 1;
        } else {
            return 0;
        }
    }
}
詳細については、link:/java-comparator-comparable[_Comparator_ and _Comparable_ in Java。]のチュートリアルをご覧ください。

3.2. 複数の継承

Javaクラスは、単一の継承をサポートします。 ただし、インターフェイスを使用すると、複数の継承を実装することもできます。
たとえば、以下の例では、_Car_ class__ ___が_Fly_およびTrans_Transform_インターフェースを実装していることがわかります。 そうすることで、メソッド_fly_および_transform_を継承します。
public interface Transform {
    void transform();
}

public interface Fly {
    void fly();
}

public class Car implements Fly, Transform {

    @Override
    public void fly() {
        System.out.println("I can Fly!!");
    }

    @Override
    public void transform() {
        System.out.println("I can Transform!!");
    }
}

3.3. 多型

link:/java-polymorphism[polymorphism]とは何ですか? 実行時にオブジェクトがさまざまな形をとることができる能力です。 より具体的には、実行時の特定のオブジェクトタイプに関連するオーバーライドメソッドの実行です。
  • Javaでは、インターフェイスを使用してポリモーフィズムを実現できます。*たとえば、_Shape_インターフェイスはさまざまな形式を取ることができます。

    _Shape_インターフェイスを定義することから始めましょう。
public interface Shape {
    String name();
}
さて、_Circle_クラスも作成しましょう。
public class Circle implements Shape {

    @Override
    public String name() {
        return "Circle";
    }
}
また、_Square_クラス:
public class Square implements Shape {

    @Override
    public String name() {
        return "Square";
    }
}
最後に、_Shape_インターフェイスとその実装を使用して、ポリモーフィズムの動作を確認します。 いくつかの_Shape_オブジェクトをインスタンス化し、_List、_に追加し、最後にループで名前を出力しましょう。
List<Shape> shapes = new ArrayList<>();
Shape circleShape = new Circle();
Shape squareShape = new Square();

shapes.add(circleShape);
shapes.add(squareShape);

for (Shape shape : shapes) {
    System.out.println(shape.name());
}

4. インターフェイスのデフォルトメソッド

Java 7以前の従来のインターフェースは、下位互換性を提供しません。
つまり、* Java 7以前で記述されたレガシーコードがあり、抽象メソッドを既存のインターフェイスに追加する場合、そのインターフェイスを実装するすべてのクラスが新しい抽象メソッドをオーバーライドする必要があります*。 そうしないと、コードが破損します。
  • Java 8は、オプションであり、インターフェースレベルで実装できるデフォルトのメソッドを導入することで、この問題を解決しました。

===

インターフェイスを介して複数の継承を実現するには、いくつかのルールを覚えておく必要があります。 これらについて詳しく見ていきましょう。

5.1. 別のインターフェイスを拡張するインターフェイス

インターフェイスが別のインターフェイスを拡張する場合、そのインターフェイスのすべての抽象メソッドを継承します。 まず、_HasColor_と_Shape_の2つのインターフェイスを作成します。
public interface HasColor {
    String getColor();
}

public interface Box extends HasColor {
    int getHeight()
}
上記の例では、キーワード_extends._を使用して、__Box ___inheritsから_HasColor_を継承します。これにより、__ Box __interfaceは_getColor_を継承します。 その結果、__Box ___interfaceには、_getColor_とget_getHeight_の2つのメソッドがあります。

5.2. インターフェイスを実装する抽象クラス

抽象クラスがインターフェイスを実装すると、その抽象メソッドとデフォルトメソッドがすべて継承されます。 _Transform_インターフェースと、それを実装する_abstract_クラス_Vehicle_を考えてみましょう。
public interface Transform {

    void transform();
    default void printSpecs(){
        System.out.println("Transform Specification");
    }
}

public abstract class Vehicle implements Transform {}
この例では、_Vehicle_クラスは、abstract _transform_ methodとdefault _printSpecs_メソッドの2つのメソッドを継承します。

6. 機能的インターフェース

Javaには、_Comparable_(Java 1.2以降)や_Runnable_(Java 1.0以降)など、初期の頃から多くの機能インターフェースがあります。
Java 8では、_Predicate _、_ Consumer _、_ Function_などの新しい機能インターフェイスが導入されました。 これらの詳細については、link:/java-8-functional-interfaces[Java 8のFunctional Interfaces]のチュートリアルをご覧ください。

7. 結論

このチュートリアルでは、Javaインターフェースの概要を説明し、それらを使用して多態性と多重継承を実現する方法について説明しました。
いつものように、完全なコードサンプルはhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-lang[GitHubで利用可能]です。