インターフェイスとは

インターフェースは、プログラムを実装しないメソッドをもつファイルです。抽象クラスと同じ考え方ですが、仕様や目的が少し違います。

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

抽象クラスとインターフェイスは似ていますが、それぞれ違いがあります。

項目 抽象クラス インターフェイス
目的 継承関係でメソッドをオーバーライド クラス仕様で型定義する設計書
キーワード abstract interface
継承/実装 extends implements
多複数クラスの引き継ぎ できない できる
インスタンス化 できない できない

複数クラスの多重承継

通常のサブクラスからスーパークラスは1つしかクラスを継承できません。 Javaでは多重継承はサポートしていませんが、インターフェイスを使うと多重継承のような複数のクラスを引き継ぐことは可能です。

インターフェイスのルール

インターフェイスの定義

インターフェイスはクラス名の前に「interface」をつけます。アクセス修飾子は「public」か「デフォルト」にします。

public interface クラス名 {

}

インターフェイスの抽象メソッド

抽象メソッドの定義は抽象クラスと同様に宣言しますが、「abstract」キーワードは省略します。

public interface クラス名 {

	データ型 メソッド名();

}

インターフェイスの実装

インターフェイスを実装するには、implementsキーワードを使い、複数のクラスを実装できます。

public サブクラス implements クラス1, クラス2 {

}

インターフェイスの命名規則

インターフェイスだとわかるように命名規則をつけるルールです。人によっていろいろな命名規則を利用するためケースバイケースですが、インターフェイスと認識できるようにしましょう。

接頭語「 I 」

インターフェイス名の先頭に、InterfaceI をつけるパターンです。

public interface ICharacter {

}

接尾語「Interface」

インターフェイス名にInterfaceをつけるパターンです。

public interface CharacterInterface {

}

接尾語「able」

インターフェイス名に able を組み合わせるパターンです。

public interface Characterable {

}

実装側に接尾語「Impl」

インターフェイス名はそのままで、実装側のクラス名に Impl 組み合わせるパターンです。

public interface Character {

}

public CharacterImpl implements Character {

}

インターフェイスの利用

Itemクラスの作成

Item.java

インターフェイスファイルの作成

「ファイル > 新規 > インターフェイス」を選択します。

インターフェイス名「ICharacter」を入力して【完了】をクリックします。

package character;

public interface ICharacter {

}

メソッドの定義

抽象クラスと同様にメソッドを追加します。

package character;

import item.Item;
import monster.Monster;

public interface ICharacter {

	public void attack(Monster monster);
	public boolean isAlive();
	public void magic(Monster monster, String key);
	public void equip(Item item);

}

実装エラー

抽象メソッド equip() がサブクラスに実装されていないため、コンパイルエラーになります。

メソッドの自動挿入

クラス名にマウスオーバーして「実装されていないメソッドの追加」をクリックします。

サブクラスに、equip() メソッドが自動挿入されました。

	@Override
	public void equip(Item item) {
		
	}

演習

問題1

インターフェイスの定義で正しいのはどれですか?

  1. public IPerson { }
  2. public abstract IPerson { }
  3. public interface IPerson { }
  4. public static IPerson { }

問題2

クラス「Person」で、インターフェイス「IPerson」の実装で正しいのはどれですか?

  1. public IPerson implements Person { }
  2. public IPerson extends Person { }
  3. public Person implements IPerson { }
  4. public Person extends IPerson { }

問題3

インターフェイスIPersonに、talk(String message) メソッドを宣言し、Personクラスで実装してみましょう。