Java 速習チュートリアル

Java インターフェース

1. インターフェース(Interfaces)

Javaにおいて抽象化(Abstraction)を実現するもう一つの方法が、インターフェース(Interfaces)です。

インターフェースとは、関連する「ボディ(実装)が空のメソッド」をグループ化するための、完全に「抽象化されたクラス」のことです。

例:

// インターフェース
interface Animal {
  public void animalSound(); // インターフェースメソッド(ボディを持ちません)
  public void run(); // インターフェースメソッド(ボディを持ちません)
}

1.1 インターフェースの実装

インターフェースのメソッドにアクセスするには、別のクラスでインターフェースを「実装(implement)」する必要があります。これには extends ではなく implements キーワードを使用します。インターフェースメソッドの具体的なボディは、この「実装クラス」側で提供されます。

例:

// インターフェース
interface Animal {
  public void animalSound(); // インターフェースメソッド(ボディなし)
  public void sleep(); // インターフェースメソッド(ボディなし)
}

// PigクラスがAnimalインターフェースを「実装(implements)」する
class Pig implements Animal {
  public void animalSound() {
    // animalSound() のボディはここで提供される
    System.out.println("ブタが鳴きます:ウィーウィー");
  }
  public void sleep() {
    // sleep() のボディはここで提供される
    System.out.println("Zzz");
  }
}

class Main {
  public static void main(String[] args) {
    Pig myPig = new Pig();  // Pigオブジェクトを作成
    myPig.animalSound();
    myPig.sleep();
  }
}

2. インターフェースに関する注意点

  • 抽象クラスと同様に、インターフェースはそれ単体でオブジェクト(インスタンス)を作成することはできません。
  • インターフェースメソッドはボディを持ちません。ボディは実装クラスによって提供されます。
  • インターフェースを実装する場合、そのインターフェースにあるすべてのメソッドをオーバーライドする必要があります。
  • インターフェースメソッドは、デフォルトで abstract かつ public です。
  • インターフェースのアトリビュート(変数)は、デフォルトで publicstatic、かつ final です。
  • インターフェースはオブジェクト作成に使用できないため、コンストラクタを持つことはできません。

3. なぜ、いつインターフェースを使用するのか?

  1. セキュリティの確保: オブジェクトの特定の詳細を隠蔽し、重要なインターフェース(接点)のみを公開するため。
  2. 多重継承の実現: Javaは「多重継承(1つのクラスが複数のスーパークラスを継承すること)」をサポートしていません。しかし、クラスは複数のインターフェースを実装できるため、インターフェースを使えば多重継承と同じ効果を得ることができます。

4. 複数のインターフェースの実装

複数のインターフェースを実装するには、それらをカンマ(,)で区切ります。

例:

interface FirstInterface {
  public void myMethod(); // インターフェースメソッド
}

interface SecondInterface {
  public void myOtherMethod(); // インターフェースメソッド
}

class DemoClass implements FirstInterface, SecondInterface {
  public void myMethod() {
    System.out.println("何らかのテキスト..");
  }
  public void myOtherMethod() {
    System.out.println("別のテキスト...");
  }
}

class Main {
  public static void main(String[] args) {
    DemoClass myObj = new DemoClass();
    myObj.myMethod();
    myObj.myOtherMethod();
  }
}