今回の記事ではJavaのインターフェースについて現役エンジニアがわかりやすく解説していきます。
インターフェースはわかりにくい概念でJavaを勉強し始めた方にとっては躓きやすい箇所です。
「インターフェースって何?」
「インターフェースの宣言の仕方がわからない」
「インターフェースの実装方法がわからない」
今回はそのような方向けに記事を書いています。
「インターフェースについて理解したい」
「インターフェースを使って実装してみたい」
ぜひ最後まで読んでいってください!
インターフェースとは
インターフェースの概要
インターフェースには定数と抽象メソッドを宣言することができます。
インターフェース内で定義した定数はpublic static finalなものになり、どこからでもアクセス可能で変更することができません。
また抽象メソッドは処理の中身が書いていないメソッドのことです。
インターフェースを利用するクラスでは抽象メソッドをオーバーライドし、メソッドでどんな処理をするのか処理を書く必要があります。
インターフェースについてわかりやすく説明
インターフェースについて現実世界の例えを用いてわかりやすく解説していきます。
インターフェースは現実世界でいうところの「資格」のようなものだと考えてください。
この世界にはいろいろな資格が存在します。
例えば自動車免許などがありますよね。
この自動車免許を持っている人は車を運転することができます。
さらに免許を見せることでも他の人にも「私は車を運転することができます」と証明できますし、免許を持っている人を見かけたら、「あ、この人は運転ができるんですね」となります。
このように何か資格を持っていると、その資格を持っている人はそれに関する能力や知識を持っていると判断することができます。
インターフェースの役割もこれと似ていて、インターフェースを実装しているとこんな処理ができるんですよ、ということを証明することができます。
他の人がクラスを利用するときに使いやすく、大規模開発での開発効率を高めることができます。
インターフェースの使い方
では実際にインターフェースを作成して、それを実装したクラスで検証してみましょう!
ちなみに、インターフェースを使って作られたクラスを作ることを「インターフェースを実装する」ということがよくあるので覚えておきましょう。
インタフェースの作成
インターフェースを作成していきます。
インターフェースの宣言は以下のような書式で行います。
public interface InterfaceName {
// 抽象メソッド
void abstractMethod();
}
今回はサンプルとして次のような自動車免許のインターフェースを作成してみます。
運転をするdriveCarメソッドを抽象メソッドとして宣言しています。
public interface CarLicenses {
/**
* 車を運転する抽象メソッド
*/
void driveCar();
}
インタフェースの実装
先ほど作成したCarLicensesを実装したクラスを作成します。
せっかちな人である「ImpatientPerson」クラスと丁寧な人である「PolitePerson」クラスを作成し、それぞれCarLicensesインターフェースを実装します。
せっかちな人
せっかちな人は運転免許を持っています。
運転免許を持っているので運転することができますが、せっかちなので少し荒い運転をします。
/**
* せっかちな人間クラス
* @author uhablog
*
*/
public class ImpatientPerson implements CarLicenses{
private String name;
public ImpatientPerson(String name) {
this.name = name;
}
/**
* driverCarをオーバーライドして中身を記述する
*/
@Override
public void driveCar() {
System.out.println(name + "は車の免許を持っているので運転ができます。");
System.out.println(name + "はせっかちなので、運転は荒い方です。");
}
}
丁寧な人
丁寧な人もせっかちな人と同じく運転免許を持っています。
なので運転をすることができますが、せっかちな人とは違い、安全運転をします。
/**
* 丁寧な人間クラス
* @author uhablog
*/
public class PolitePerson implements CarLicenses{
private String name;
public PolitePerson(String name) {
this.name = name;
}
/**
* driveCarをオーバーライドして中身を記述
*/
@Override
public void driveCar() {
System.out.println(name + "は車の免許を持っているので運転ができます。");
System.out.println(name + "は丁寧なので、安全運転をします。");
}
}
実行結果
せっかちな人クラスと丁寧な人クラスを作成し、それぞれCarLicensesインターフェースを実装しました。
2つのクラスをインスタンスかして、それぞれdriveCarメソッドを呼び出してみます。
public class Test {
/**
* せっかちな人間と丁寧な人間に運転させる
* @author uhablog
*/
public static void main(String[] args) {
// せっかちな太郎くんに運転してもらう
ImpatientPerson taro = new ImpatientPerson("太郎");
taro.driveCar();
// 改行
System.out.println();
// 丁寧な花子さんに運転してもらう
PolitePerson hanako = new PolitePerson("花子");
hanako.driveCar();
}
}
実行結果は次のようになります。
せっかちな太郎君は荒い運転をしました。
丁寧な花子さんは安全運転をしてくれました。
太郎は車の免許を持っているので運転ができます。
太郎はせっかちなので、運転は荒い方です。
花子は車の免許を持っているので運転ができます。
花子は丁寧なので、安全運転をします。
今回の記事ではインターフェースについて解説してきました。
インターフェースは定数と抽象メソッドを定義することができます。
インターフェースを使ったクラスを作成することを「インターフェースを実装する」と言い、実装クラスはインターフェースで宣言された抽象メソッドの中身の処理を記述する必要があります。
インターフェースは現実世界でいうところの「資格」と似ていて、「その資格を持っているならこんなことできるよね?」というのを「そのインターフェース実装しているなら、この処理できるよね?」ということを証明できます。
これは大規模開発や他人が自分の作成したクラスを使う場面などでメリットを発揮します。