🔖

[Javaの基礎]インターフェース

に公開

はじめに

ここでは以下についてまとめている。

  • インターフェースとは
  • defaultメソッド・staticメソッド
  • 関数型インターフェース

インターフェースとは

クラスに実装を強制するメソッドの集合を定義するための仕組みです。
メソッドの「名前・引数・戻り値」だけを定義し、実装はインターフェースを実装するクラス側に任せます。インタフェースを実装するクラスは、インタフェースで宣言されたすべてのメソッドを実装する必要があります。
クラスが単一継承なのに対して多重実装が可能であり柔軟な設計ができます。
インターフェースは以下のような場合に使用します。

  • 多態性の実現(ポリモーフィズム)
  • 依存性の逆転(DI)に役立つ
  • 関数型インターフェースのベース(Runnable, Callable, Functionなど)

基本構文

interface インターフェース名 {
    戻り値の型 メソッド名(引数);
}
class クラス名 implements インターフェース名 {
    // インターフェース内の全メソッドをオーバーライドする必要がある
}

インターフェースの例

public interface Animal {
    void speak();
}

実装クラス

public class Dog implements Animal {
    @Override
    public void speak() {
        System.out.println("ワンワン!");
    }
}

public class Cat implements Animal {
    @Override
    public void speak() {
        System.out.println("ニャー!");
    }
}
public class Main {
    public static void main(String[] args) {
        Animal dog = new Dog();
        dog.speak(); // → ワンワン!

        Animal cat = new Cat();
        cat.speak(); // → ニャー!
    }
}

defaultメソッド・staticメソッド

  • defaultを使用してメソッドの実装が可能
    • 実装クラスでオーバーライド可能
  • staticを使用してstaticメソッドの定義も可能
    • インターフェース名から直接呼び出す
interface Greeter {
    default void hello() {
        System.out.println("こんにちは!");
    }

    static void greetAll() {
        System.out.println("みんな、こんにちは!");
    }
}

関数型インターフェース

  • 1つだけ抽象メソッドを持つインターフェース
  • Java 8以降、ラムダ式やメソッド参照で扱える

Runnable(戻り値なし、引数なし)

主にスレッド処理用に使用されます。
Threadクラスは、Javaで並行処理(マルチスレッド)を行うための仕組みを提供しています。

  • メソッド:void run()
  • 戻り値:なし
  • 使用例:並列処理、非同期処理
Runnable task = () -> {
    System.out.println("実行中!");
};

Thread thread = new Thread(task);
thread.start();

Callable<V>(戻り値あり、例外も投げられる)

  • メソッド:V call() throws Exception
  • 戻り値:任意の型(V
  • 使用例:スレッドで結果を取得したいとき
Callable<Integer> task = () -> {
    return 123;
};

ExecutorService executor = Executors.newSingleThreadExecutor();
Future<Integer> future = executor.submit(task);
Integer result = future.get(); // → 123

Function<T, R>(引数あり・戻り値あり)

  • メソッド:R apply(T t)
  • 使用例:コレクション操作・ストリーム処理など
Function<String, Integer> stringLength = str -> str.length();

int len = stringLength.apply("Hello"); // → 5

Discussion