Java的InterFace

 この文章は下記のアドレスで記載されています。

http://www.javaroad.jp/java_interface1.htm


インタフェース-1.はじめてのインタフェース
このページではJavaでのインタフェースの概要について説明をします。
インタフェースの特徴・利點
インタフェースとは、ある特定の機能の概要を記述したものです。インタフェースを実裝したクラスは、同一のインタフェースを実裝したクラスとの間においてある特定の機能の概要を共通に持ちます。機能概要の詳細はそれぞれのクラスで定義します
インタフェースの概要
インタフェースの利點の1つとしてクラスが複數のインタフェースを実裝できると言うのがあります。ある特定の機能の概要をクラスに実裝する方法としてextendsを使用してスーパークラスを継承すると言う方法もあります。しかしこの場合複數のスーパークラスを継承することはできません。Javaでは複數のスーパークラスの継承(多重継承)が認められていないためです。

また、extendsによりスーパークラスを継承すると言うことは継承したサブクラスと継承されたスーパークラスの間にクラス関係を持つと言うことになります。スーパークラスとサブクラスの間にクラス関係が見受けられない場合においてもこのような継承を行うことはクラス設計上不適切です。このような場合はインタフェースを使用します。インタフェースの実裝はクラス関係に依存しません


【クラスの継承を利用した場合】
クラスの継承を利用した場合
【インタフェースを利用した場合】
インタフェースを利用した場合
インタフェースの使用例
挨拶を行うインタフェースと日付を表示するインタフェースを作成し、それぞれをクラスで実裝します。

【例1】
Greeting.javaファイル

//(1)インタフェースGreetingの作成
interface Greeting {
  void greet();  //(2)インタフェース內ではヘッダー定義のみ
}

ShowingDate.javaファイル

//(3)インタフェースShowingDateの作成
interface ShowingDate {
  void showDate();  //(4)インタフェース內ではヘッダー定義のみ
}

ExInterface1.javaファイル

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

//(5)インタフェースGreetingとShowingDateの実裝
public class ExInterface1 implements Greeting, ShowingDate{
  public void greet() {  //(6)メソッドgreetの本體の定義
    System.out.println("こんにちは");
  }

  public void showDate() {  //(7)メソッドshowDateの本體の定義
    SimpleDateFormat dateformatter =
                     new SimpleDateFormat("yyyy/MM/dd");
    String dateString = dateformatter.format(new Date());
    System.out.println(dateString);
  }

  public static void main(String[] args) {
    ExInterface1 object1 = new ExInterface1();  //(8)
    object1.greet();  //(9)
    object1.showDate();  //(10)
  }
}

【解説1】

(1). 挨拶を行うインタフェースGreetingを作成します。
(2). メソッドgreetを定義します。インタフェース內ではヘッダーの定義のみで本體の定義は、インタフェースを実裝したクラス內で行います。
(3). 日付を表示するインタフェースShowDatingを作成します。
(4). メソッドshowDateを定義します。インタフェース內ではヘッダーの定義のみで本體の定義は、インタフェースを実裝したクラス內で行います。
(5). クラスExInterface1を定義し、インタフェースGreetingとShowingDateを実裝します。インタフェースの実裝にはimplementsを使用します。
(6). インタフェース內で定義されたメソッドgreetの本體を定義します。メソッドの本體の定義はインタフェースを実裝したそれぞれのクラスの中で行います。インタフェース內で定義したのはヘッダーのみで、「日本語で挨拶文を表示するか」、「英語で挨拶文を表示するか」など具體的な本體はそれぞれのクラス內で定義します。
(7). インタフェース內で定義されたメソッドshowDateの本體を定義します。ここでは、SimpleDataFormatクラスを使用し、プログラム実行時の日付を「yyyy/mm/dd」フォーマットに従い出力しています。
(8). クラスExInterface1のオブジェクトobject1を生成します。
(9). メソッドgreetを実行します。
(10). メソッドshowDateを実行します。
【実行結果1】
D:/JAVA>javac ExInterface1.java

D:/JAVA>java ExInterface1
こんにちは
2003/04/13

D:/JAVA>
インタフェースの使用例

インタフェース-2.インタフェースの宣言(interface)
このページではJavaでのインタフェースの宣言方法について説明します。
インタフェースの宣言
インタフェースの宣言は以下の枠內のフォーマットにより構成されます。interfaceとインタフェース名は必須項目です
public interface インタフェース名
               extends スーパーインタフェース名,・・・
修飾子
説明
public
インタフェースのアクセスレベルを指定します。publicがなければインタフェースと同じパッケージ內で定義されたクラスのみからアクセスできることを表します。publicがあれば全クラスからアクセスできることを表します。
interface
インタフェースの宣言を意味します。インタフェース宣言時の必須項目です。
インタフェース名
宣言されたインタフェースのインタフェース名を意味します。インタフェース宣言時の必須項目です。
extends
スーパーインタフェース名を継承したい時に使用します。
スーパーインタフェース名
継承したいスーパーインタフェース名です。スーパーインタフェース名は,(カンマ)により複數宣言することができます。
メンバ変數、メソッドの宣言
インタフェース內でメンバ変數を宣言する場合、そのメンバ変數は暗黙的にpublic、static、finalの修飾子が付與されます。final修飾子が付與されることからもインタフェース內で宣言されたメンバ変數は定數と言うことができます。メンバ変數宣言時に明示的にこれらの修飾子を付與する必要はありません。

インタフェース內でメソッドを宣言する場合、そのメソッドは暗黙的にpublic、abstractの修飾子が付與されます。abstract修飾子が付與されていることからもインタフェース內で宣言されたメソッドは抽象メソッドと言うことができます。メソッド宣言時に明示的にこれらの修飾子を付與する必要はありません。抽象メソッドであるため、インタフェース內でメソッドを宣言する場合、メソッドのヘッダー部分のみを宣言します。メソッド本體の定義はインタフェースを実裝したクラス內で行います。
インタフェースのメンバ変數、メソッドの宣言
インタフェース內でメンバ変數、メソッドを宣言する場合、修飾子としてtransient、volatile、synchronizeを付與することはできません。またアクセスレベルとして、private、protectedを付與することもできません。

【例1】インタフェースの宣言例です。

//インタフェースExInterface2の宣言
interface ExInterface2 {

  //引數にdouble型の引數dを持つメソッドexMethodの宣言
  void exMethod(double d);

  //double型の定數EXMEMBERの宣言
  double EXMEMBER = 100.256d;
}
インタフェースとabstractクラスの違い
インタフェースを実裝したクラスでメソッドの本體を定義すると言うことを考えると、abstractクラスを継承したクラスでabstractメソッドの本體を定義するというのとよく似ています。インタフェースとabstractクラスには以下に示すような違いがあります。
インタフェースではどのメソッドも本體を定義することはできませんが、abstractクラスには本體を定義したメソッド(abstractでないメソッド)を含めることができます。
インタフェースは複數実裝できますが、abstractクラスは1つのみしか継承できません(多重継承がサポートされていないため)。
abstractクラスは継承したクラスとの間にクラス関係を意識する必要がありますが、インタフェースは実裝したクラスとの間にクラス関係を意識する必要はありません。


インタフェース-3.インタフェースの実裝(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). 國名が代入されたメンバ変數と挨拶を行うメソッドが定義されたHelloWorldインタフェースを作成します。
(2). 國名が代入されたメンバ変數COUNTRYを定義します。
(3). 挨拶を行うメソッドsayHelloのヘッダーを定義します。
(4). クラスExInterface3を定義し、インタフェースHelloWorldの実裝を行います。
(5). メソッドsayHelloの本體を定義します。ここでは引數xに指定された數だけ、printlnメソッドを繰り返すよう定義しています。
(6). インタフェースで定義されたメンバ変數COUNTRYを參照しています。インタフェースを実裝しているため「単純名」で參照することができます。
(7). クラスExInterface3のオブジェクトobject1を生成しています。
(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>
發佈了26 篇原創文章 · 獲贊 4 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章