インターフェイス
メソッドの具体的な処理内容を記述せず、変数とメソッドの型のみを定義したもの。
メソッドの型だけを先に記述しておき、利用する直前で処理内容を記述することができる。
インターフェイスの宣言
interface インターフェイス名{}
インターフェイスの実装
クラス名 implements インターフェイス名{}
インターフェイを実装したクラスのインスタンス化では、インターフェイス名を変数の型として使う。
例
sample.java
public class Sample {
public static void main(String[] args) {
Flyable f1 = new FlyingPerson("太郎", 8, Person.MAN);// インターフェイスのインスタンス化
f1.fly();
}
}
Person.java
public class Person {
final static int MAN = 1;
final static int WOMAN = 2;
String name;
int age;
int sex;
public Person(String name, int age, int sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public void sayHello(int time) {
String m = this.getHelloMessage(time);
System.out.println(m);
}
public void sayHello(int time, Person target) {
String m = this.getHelloMessage(time);
if (target != null) {
System.out.println(target.name + "さん、" + m);
} else {
System.out.println(m);
}
}
public String getHelloMessage(int time) {
String text = "";
if (5 <= time && time < 10) {
text = "おはようございます";
} else if (10 <= time && time < 17) {
text = "こんにちは";
} else {
text = "こんばんわ";
}
String message = text + "、" + name + age + "才です。";
return message;
}
public void addAge() {
this.age++;
}
}
Flyable.java
//インターフェイスの定義
public interface Flyable {
void fly();// メソッドの定義
}
FlyingPerson.java
// Personクラスの継承とFlyableインターフェイスの実装
public class FlyingPerson extends Person implements Flyable {
public FlyingPerson(String name, int age, int sex) {
super(name, age, sex);
}
// インターフェイス内のメソッドを実装
public void fly() {
System.out.println("なんと人間が空を飛んでいます");
}
}
抽象クラスとの違い
-
抽象クラス
継承関係にあるクラスに対してのみに影響を与える。すなわち、継承元であるスーパークラス(親クラス)は1つに限られている。
一方で、メソッドのオーバーライドができるというメリットがある。すなわち、親クラスのメソッドをサブクラスで書き換えることができる。 -
インターフェイス
継承関係なく、実装することができる。複数のインターフェースを継承して新しいインターフェースを作る(多重継承する)ことができる。