インターフェイスとは

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

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

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

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

複数クラスの多重承継

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

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

インターフェイスの定義

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

public interface クラス名 {

}

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

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

public interface クラス名 {

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

}

インターフェイスの実装

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

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

}

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

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

接頭語「 I 」

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

public interface ICharacter {

}

接尾語「Interface」

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

public interface CharacterInterface {

}

接尾語「able」

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

public interface Characterable {

}

実装側に接尾語「Impl」

インターフェイス名はそのままで、実装側のクラス名に「Impl」つけるパターンです。

public interface Character {

}

public CharacterImpl implements Character {

}

インターフェイスの利用

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

ICharacter.javaファイルを作成し、interfaceを選択します。

ICharacterインターフェイスが作成できました。

ICharacter.java
package character;

public interface ICharacter {

}

Itemクラス作成

Itemクラスを作成し、プロパティ、コンストラクタ、アクセサメソッドなどを追加します。

package rpg.item;

public class Item {

	public String name;
	public ItemType type;
	public int attackPower;
	public int defencePower;
	public int price;

	public Item() {
	}

	public Item(ItemType type, String name, int attackPower, int defencePower, int price) {
		this.name = name;
		this.type = type;
		this.price = price;
		this.attackPower = attackPower;
		this.defencePower = defencePower;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public ItemType getType() {
		return type;
	}

	public void setType(ItemType type) {
		this.type = type;
	}

	public int getAttackPower() {
		return attackPower;
	}

	public void setAttackPower(int attackPower) {
		this.attackPower = attackPower;
	}

	public int getDefencePower() {
		return defencePower;
	}

	public void setDefencePower(int defencePower) {
		this.defencePower = defencePower;
	}

	public int getPrice() {
		return price;
	}

	public void setPrice(int price) {
		this.price = price;
	}
	
}

抽象メソッドの定義

ICharacterインターフェイスに抽象メソッドを追加します。

ICharacter.java
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() メソッドが自動挿入されました。

ICharacter.java
	@Override
	public void equip(Item item) {
		
	}

Itemを使った実装

equip() メソッドでItemインスタンスを使った処理します。

ICharacter.java
@Override
public void equip(Item item) {
    this.attackPower += item.attackPower;
    this.defencePower += item.defencePower;
}

メインプログラム

キャラクターがアイテムを装備するメインプログラムEquipAppを作成します。

EquipApp.java
package rpg;

import rpg.item.Item;

public class EquipApp {
    
    public static void main(String[] args) {
        Wizard wizard1 = new Wizard("アリス");
        Item weapon = new Item("ブロンズナイフ", 300, 5, 0);
        Item armor = new Item("ブロンズアーマー", 400, 0, 6);

        System.out.println("--- before ---");
        System.out.println(wizard1.attackPower);
        System.out.println(wizard1.defencePower);

        wizard1.equip(weapon);
        wizard1.equip(armor);

        System.out.println("--- after ---");
        System.out.println(wizard1.attackPower);
        System.out.println(wizard1.defencePower);
    }
}

メインプログラムを実行して、attackPowerdefencePowerを確認してみましょう。

結果
--- before ---
3
3
--- after ---
8
9

演習

問題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」クラスで実装してみましょう。

問題4

JavaBeansの説明で「間違っている」のはどれですか?

  1. 引数なしのコンストラクタを定義する
  2. setter/getterを利用する
  3. 1次元のデータ列に変換(シリアライズ)を利用する
  4. データベース処理と画面用処理を1ファイルにまとめる