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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值