こんにちは!エンジニアの中沢です。
Javaには初めに処理内容を具体的に書かず、後からメソッドの実装をして使用するためのinterface(インタフェース)があります。
この記事では、interfaceとは何かやinterfaceの使い方という基本的な内容から、
- defaultメソッドの使い方
- インタフェースのstaticメソッドの使い方
- インタフェースと抽象クラスの違い
などの応用的な使い方に関しても解説していきます。今回はこれらの方法を覚えるために、interfaceのさまざまな使い方をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
interfaceとは
interfaceは初めに処理内容を具体的に書かず、後からメソッドの実装をして使用するために使います。後からメソッドの実装をするため、処理を変えたい場合に有効です。interfaceは次のように記述します。
interface Calc{ // メソッドの宣言 void calc(); }
interfaceの具体的な使い方をこれから解説していきます。
interfaceの使い方
インタフェースでは定数とメソッドのみが定義できます。インタフェースのメンバ変数は自動的にpublic static finalが付けられるので定数になります。
インタフェースのメソッドは抽象メソッドと同様に、インタフェースを実装したクラスでメソッドを実装する必要があります。クラスにインタフェースを実装するにはimplementsを使用します。これらのインタフェースの使い方を次のプログラムで確認してみましょう。
// インタフェースの作成 interface Calc { int NUM1 = 1; int NUM2 = 2; void calc(); } // インタフェースを実装し、足し算するクラスを作成 class Add implements Calc { public void calc() { System.out.println(NUM1 + NUM2); } } // インタフェースを実装し、引き算するクラスを作成 class Sub implements Calc { public void calc() { System.out.println(NUM1 - NUM2); } } // インターフェースを実装したクラスを実行するクラスを作成 public class Main { public static void main(String[] args) { Add add = new Add(); add.calc(); Sub sub = new Sub(); sub.calc(); } }
[実行結果]
3 -1
このプログラムではCalcインタフェースのcalcメソッドを、実装先のAddクラスとSubクラスのそれぞれで実装しています。このプログラムの実行結果からAddクラスでは足し算を行い、Subクラスでは引き算を行うというように処理を変更できていることが確認できました!
interfaceの使い方についてはこちらで詳しく解説しているので、ぜひ確認してください!
defaultメソッドの使い方
interfaceのdefaultメソッドを使うことで、処理内容を実装したメソッドを定義することができます。defaultメソッドの使い方を次のプログラムで確認してみましょう。
// インタフェースの作成 interface Calc { int NUM1 = 1; int NUM2 = 2; default public void calc() { System.out.println(NUM1 + NUM2); } } // インタフェースを実装し、足し算するクラスを作成 class Add implements Calc { // オーバーライドしないので何も記述しない } // インタフェースを実装し、引き算するクラスを作成 class Sub implements Calc { public void calc() { System.out.println(NUM1 - NUM2); } } // インターフェースを実装したクラスを実行するクラスを作成 public class Main { public static void main(String[] args) { Add add = new Add(); add.calc(); Sub sub = new Sub(); sub.calc(); } }
[実行結果]
3 -1
このプログラムではCalcインタフェースのcalcメソッドを、実装先のAddクラスでオーバーライドせずにそのまま使用しています。Subクラスではcalcメソッドをオーバーライドして引き算の処理に変えています。
このプログラムの実行結果からAddクラスではdefaultメソッドを使って足し算を行い、Subクラスではオーバーライドして引き算を行うという処理ができていることが確認できました!
interfaceのdefaultメソッドの使い方についてはこちらで詳しく解説しているので、ぜひ確認してください!
インタフェースのstaticメソッドの使い方
インタフェースのstaticメソッドを使うことで、インスタンスを生成せずに直接メソッドを呼び出すことができます。インタフェースのstaticメソッドの使い方を次のプログラムで確認してみましょう。
// インタフェースの作成 interface Calc { int NUM1 = 1; int NUM2 = 2; public static void calc() { System.out.println(NUM1 + NUM2); } } public class Main { public static void main(String[] args) { Calc.calc(); } }
[実行結果]
3
このプログラムではインタフェースのstaticメソッドを、Mainクラスから直接呼び出して使用しています。このプログラムの実行結果から、インタフェースでstaticメソッドが使用できることが確認できました。
インタフェースと抽象クラスの違い
最後にインタフェースと抽象クラスの違いについて解説します。抽象クラスでは複数のクラスを継承する多重継承はできませんが、インタフェースは多重継承のように複数のインタフェースを実装をすることができます。
複数のインタフェースを実装する方法を、次のプログラムで確認してみましょう。
//インタフェースの作成 interface Add { int NUM1 = 1; void add(); } // インタフェースの作成 interface Sub { int NUM2 = 2; void sub(); } // 2つのインタフェースを実装するクラスの作成 class Calc implements Add, Sub { public void add() { System.out.println(NUM1 + NUM2); } public void sub() { System.out.println(NUM1 - NUM2); } } // インターフェースを実装したクラスを実行するクラスを作成 public class Main { public static void main(String[] args) { Calc calc = new Calc(); calc.add(); calc.sub(); } }
[実行結果]
3 -1
このプログラムではCalcクラスで、AddとSubの2つのインタフェースを実装しています。Calcクラスでは、実装した2つのインタフェースの変数NUM1、NUM2の両方を使用することができています。
このプログラムの実行結果から複数のインタフェースの実装ができることが確認できました!抽象クラスの使い方についてはこちらで詳しく解説しているので、ぜひ確認してください!
まとめ
いかがでしたか?今回はinterfaceの使い方について解説しました。インタフェースは後からメソッドの実装をするため、処理を変えたい場合に有効なのでぜひ覚えてくださいね。
もし、interfaceを使う方法を忘れてしまったらこの記事を確認してください!