インターフェース
abstractと同様にクラスにメソッドを強制実装させる命令があります。それがinterface(インターフェース)です。
abstractはスーパークラスなので継承元クラスに一つしか定義できませんが、intaerfaceはクラスに複数定義できます。プログラムで確認していきましょう。
プロジェクトjava01にパッケージstep12、クラス「Curve」を作成し、次のプログラムを入力してください。
1 2 3 4 5 6 7 8 9 |
package step12; public interface Curve { double PI = 3.14; void curve01(); } |
さらにクラス「Fork」を作成し、次のプログラムを入力してください。
1 2 3 4 5 6 7 |
package step12; public interface Fork { void fork01(); } |
インタフェースを利用するクラスは次のように「implements」の後ろにインタフェースクラス名を記述していきます。abastractと違い複数記述することができます。
クラスChildの3行目を次のように変更してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package step12; public class Child extends Parent implements Curve,Fork{ public void child01() { System.out.println("child01"); } public void child02() { System.out.println("child02"); } @Override public void parent02() { System.out.println("child-parent02"); } @Override void parent03() { // TODO 自動生成されたメソッド・スタブ } } |
クラスChildでエラーが発生しました。
インターフェースで宣言されたメソッドをクラスChildに実装する必要があります。次の19行目~29行目のようにメソッドを実装してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package step12; public class Child extends Parent implements Curve,Fork{ public void child01() { System.out.println("child01"); } public void child02() { System.out.println("child02"); } @Override public void parent02() { System.out.println("child-parent02"); } @Override void parent03() { // TODO 自動生成されたメソッド・スタブ } @Override public void fork01() { // TODO 自動生成されたメソッド・スタブ System.out.println(Curve.PI); } @Override public void curve01() { // TODO 自動生成されたメソッド・スタブ } } |
インターフェースは定義したクラスにメソッドの実装を強制させますが、その他に定数の定義ができます。それがインターフェースCurveの5行目です。
5 |
double PI = 3.14; |
この定数は定義したクラスで利用できます。クラスChildの22行目です。
22 |
System.out.println(Curve.PI); |
なにが便利?
abstractはクラス作成時のルール化として利用できました。interfaceはクラスに複数定義できるので、外部プログラムからメソッドを利用する際の統一化ができます。
例えば、クラスAでテレビ機能、ラジオ機能を作成する場合は、インタフェースTv,Radioを定義します。クラスBでテレビ機能、スマホ機能を作成した場合は、インタフェースTv,Smartを定義します。外部プログラムからテレビ機能を使いたい場合に、クラスA、クラスBともインタフェースTvが定義されているので、同一のメソッドを利用してクラスA,Bのテレビ機能を使えます。