Javaに関する様々な情報をご紹介します。

3インタフェースの実装(implements)

Javaに関する様々な情報をご紹介します。

インタフェースの実装(implements)

このページではインタフェースの実装方法について説明します。

インタフェースの実装

インタフェースの実装はimplementsを使用して行います。インタフェースは1つのクラスに対し、複数実装することもできます。また、クラスがextendsを使用する場合は、implementsはextendsの後に指定します。

class クラス名 implements  インタフェース名 ,・・・


class クラス名 extends  スーパークラス名  implements  インタフェース名

メソッド本体の定義

インタフェースを実装したクラスではインタフェース内で定義されたメソッドの本体を定義する必要があります。この本体の定義がメソッドの具体的な振る舞いとなります。クラス内でメソッド本体の定義を行う場合いくつかの注意点があります。

  • インタフェース内で定義されたメソッドは暗黙的にpublic、abstract修飾子が付与されています。そのため、クラス内でメソッドの定義を行う場合は明示的にpublic修飾子を付与する必要があります。
  • インタフェースを実装したクラスではそのインタフェースで宣言されたすべてのメソッドの本体を定義する必要があります。すべてを定義しない場合はそのクラスはabstractクラスと宣言される必要があります。

メンバ変数、メソッドの参照

  • インタフェースを実装したクラスでは、インタフェースで宣言されたメンバ変数を「単純名」で参照できます。インタフェースを実装していないクラスからは「インタフェース名.単純名」で参照する必要があります。
  • インタフェースで定義されたメソッドを参照する場合、必ずそのインタフェースを実装したクラスのオブジェクトを通して参照する必要があります。

【例1】インタフェースの実装例です。

HelloWorld.javaファイル

//(1)インタフェースHelloWorldの作成
interface HelloWorld {
    //(2)メンバ変数COUNTRYを定義
    String COUNTRY = "United States";
    //(3)メソッドsayHelloのヘッダーを定義
    void sayHello(int x);
}

ExInterface3.javaファイル

//(4)インタフェースHelloWorldの実装
public class ExInterface3 implements HelloWorld {
    //(5)メソッドsayHelloの本体の定義
    public void sayHello(int x) {
        for (int i = 0; i < x; i++) {
            System.out.println("Hello!!");
        }
    }
    public static void main(String[] args) {
        System.out.println(COUNTRY);  //(6)メンバ変数COUNTRYの参照
        ExInterface3 object1 = new ExInterface3();  //(7)
        object1.sayHello(5);  //(8)メソッドsayHelloの実行
    }
}

解説1

  1. (1)国名が代入されたメンバ変数と挨拶を行うメソッドが定義されたHelloWorldインタフェースを作成します。
  2. (2)国名が代入されたメンバ変数COUNTRYを定義します。
  3. (3)挨拶を行うメソッドsayHelloのヘッダーを定義します。
  4. (4)クラスExInterface3を定義し、インタフェースHelloWorldの実装を行います。
  5. (5)メソッドsayHelloの本体を定義します。ここでは引数xに指定された数だけ、printlnメソッドを繰り返すよう定義しています。
  6. (6)インタフェースで定義されたメンバ変数COUNTRYを参照しています。インタフェースを実装しているため「単純名」で参照することができます。
  7. (7)クラスExInterface3のオブジェクトobject1を生成しています。
  8. (8)インタフェースで定義されたメソッドsayHelloを実行しています。実行はインタフェースを実装したクラスExInterface3のオブジェクトを通して行っています。

実行結果1

D:\JAVA>javac ExInterface3.java

D:\JAVA>java ExInterface3
United States
Hello!!
Hello!!
Hello!!
Hello!!
Hello!!

D:\JAVA>

インタフェース変数

インタフェースはクラス型のオブジェクト変数と同様にインタフェース型のインタフェース変数を作成することができます。インタフェース変数に代入できる値はそのインタフェースを実装したクラスのオブジェクト変数のみです。これは以下のように言うこともできます。

  • インタフェース変数に代入できるオブジェクト変数のオブジェクトは、そのインタフェースで定義されたメソッドの実装が保証されている。

【例2】インタフェース変数の特徴をいかしたプログラムの例です。

ProfileInterface.javaファイル

//インタフェースProfileInterfaceの作成
interface ProfileInterface {
    //メソッドshowDateのヘッダー定義
    void showDate();
    //メソッドshowNameのヘッダー定義
    void showName(String name);
    //メソッドshowAddressのヘッダー定義
    void showAddress(String address);
}

ShowProfile.javaファイル

import java.text.*;
import java.util.*;

//クラスshowProfileの宣言、インタフェースProfileInterface
//の実装
class ShowProfile implements ProfileInterface {
    //メソッドshowDateの本体の定義
    //yyyy/MM/ddフォーマットで日付を表示
    public void showDate() {
        SimpleDateFormat dateformatter =
        new SimpleDateFormat("yyyy/MM/dd");
        String dateString = dateformatter.format(new Date());
        System.out.println(dateString);
    }
    //メソッドshowNameの本体の定義
    public void showName(String name) {
        System.out.println(name);
    }
    //メソッドshowAddressの本体の定義
    public void showAddress(String address) {
        System.out.println(address);
    }
}

ExInterface4.javaファイル

//クラスExInterface4の宣言
public class ExInterface4 {
    //インタフェース変数piを引数に取るメソッドshowBasicの
    //宣言piに代入できるオブジェクト変数はインタフェース
    //で定義されたメソッドの実装が保証されている。
    void showBasic (ProfileInterface pi) {
        //メソッドshowDateの実行
        pi.showDate();
        //メソッドshowNameの実行
        pi.showName("Java太郎");
        //メソッドshowAddressの実行
        pi.showAddress("東京都千代田区");
    }
    public static void main(String[] args) {
        //インタフェースProfileInterfaceを実装した
        //クラスShowProfileのオブジェクトの生成
        ShowProfile sp = new ShowProfile();
        ExInterface4 object1 = new ExInterface4();
        //オブジェクト変数spを引数にメソッドの実行
        object1.showBasic(sp);
    }
}
インタフェース:ProfileInterface
以下のメソッドのヘッダーが定義されたインタフェース
showDateメソッド:日付を表示
showNameメソッド:名前を表示
showAddressメソッド:住所を表示
クラス:ShowProfile
インタフェースProfileInterfaceを実装し、showDateメソッド、showNameメソッド、showAddressメソッドの本体を定義したクラス。
クラス:ExInterface4
showBasicメソッド:引数にインタフェース変数piをとるメソッド
mainメソッド:クラスExInterface4のmainメソッド

showBasicメソッドの引数に必ずインタフェースProfileInterfaceで定義されたメソッドを実装したオブジェクトのオブジェクト変数を取りたいとします。このような場合に、メソッドshowBasicの引数の引数型をインタフェース型にします。このことにより、インタフェース変数piに代入可能なオブジェクトはすべてshowDate、showName、showAddressメソッドの実装が保証されていると言うことができます。

実行結果2

D:\JAVA>javac ExInterface4.java

D:\JAVA>java ExInterface4
2003/04/19
Java太郎
東京都千代田区

D:\JAVA>

3インタフェースの実装(implements)