この文章は下記のアドレスで記載されています。
http://www.javaroad.jp/java_interface1.htm
●インタフェース-1.はじめてのインタフェース
このページではJavaでのインタフェースの概要について説明をします。 |
インタフェースの特徴・利點 |
インタフェースとは、ある特定の機能の概要を記述したものです。インタフェースを実裝したクラスは、同一のインタフェースを実裝したクラスとの間においてある特定の機能の概要を共通に持ちます。機能概要の詳細はそれぞれのクラスで定義します。 |
インタフェースの利點の1つとしてクラスが複數のインタフェースを実裝できると言うのがあります。ある特定の機能の概要をクラスに実裝する方法としてextendsを使用してスーパークラスを継承すると言う方法もあります。しかしこの場合複數のスーパークラスを継承することはできません。Javaでは複數のスーパークラスの継承(多重継承)が認められていないためです。 また、extendsによりスーパークラスを継承すると言うことは継承したサブクラスと継承されたスーパークラスの間にクラス関係を持つと言うことになります。スーパークラスとサブクラスの間にクラス関係が見受けられない場合においてもこのような継承を行うことはクラス設計上不適切です。このような場合はインタフェースを使用します。インタフェースの実裝はクラス関係に依存しません。 【クラスの継承を利用した場合】 |
【インタフェースを利用した場合】 |
インタフェースの使用例 |
挨拶を行うインタフェースと日付を表示するインタフェースを作成し、それぞれをクラスで実裝します。 |
【例1】 |
|
ShowingDate.javaファイル |
|
ExInterface1.javaファイル |
|
【解説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】 |
|
このページではJavaでのインタフェースの宣言方法について説明します。 |
インタフェースの宣言 |
インタフェースの宣言は以下の枠內のフォーマットにより構成されます。interfaceとインタフェース名は必須項目です。 |
|
|
インタフェース內でメンバ変數を宣言する場合、そのメンバ変數は暗黙的にpublic、static、finalの修飾子が付與されます。final修飾子が付與されることからもインタフェース內で宣言されたメンバ変數は定數と言うことができます。メンバ変數宣言時に明示的にこれらの修飾子を付與する必要はありません。 インタフェース內でメソッドを宣言する場合、そのメソッドは暗黙的にpublic、abstractの修飾子が付與されます。abstract修飾子が付與されていることからもインタフェース內で宣言されたメソッドは抽象メソッドと言うことができます。メソッド宣言時に明示的にこれらの修飾子を付與する必要はありません。抽象メソッドであるため、インタフェース內でメソッドを宣言する場合、メソッドのヘッダー部分のみを宣言します。メソッド本體の定義はインタフェースを実裝したクラス內で行います。 |
インタフェース內でメンバ変數、メソッドを宣言する場合、修飾子としてtransient、volatile、synchronizeを付與することはできません。またアクセスレベルとして、private、protectedを付與することもできません。 |
【例1】インタフェースの宣言例です。 |
|
インタフェースとabstractクラスの違い |
インタフェースを実裝したクラスでメソッドの本體を定義すると言うことを考えると、abstractクラスを継承したクラスでabstractメソッドの本體を定義するというのとよく似ています。インタフェースとabstractクラスには以下に示すような違いがあります。 |
・ | インタフェースではどのメソッドも本體を定義することはできませんが、abstractクラスには本體を定義したメソッド(abstractでないメソッド)を含めることができます。 |
・ | インタフェースは複數実裝できますが、abstractクラスは1つのみしか継承できません(多重継承がサポートされていないため)。 |
・ | abstractクラスは継承したクラスとの間にクラス関係を意識する必要がありますが、インタフェースは実裝したクラスとの間にクラス関係を意識する必要はありません。 |
●インタフェース-3.インタフェースの実裝(implements)
このページではインタフェースの実裝方法について説明します。 |
インタフェースの実裝 |
インタフェースの実裝はimplementsを使用して行います。インタフェースは1つのクラスに対し、複數実裝することもできます。また、クラスがextendsを使用する場合は、implementsはextendsの後に指定します。 |
|
|
インタフェースを実裝したクラスではインタフェース內で定義されたメソッドの本體を定義する必要があります。この本體の定義がメソッドの具體的な振る舞いとなります。クラス內でメソッド本體の定義を行う場合いくつかの注意點があります。 |
・ | インタフェース內で定義されたメソッドは暗黙的にpublic、abstract修飾子が付與されています。そのため、クラス內でメソッドの定義を行う場合は明示的にpublic修飾子を付與する必要があります。 |
・ | インタフェースを実裝したクラスではそのインタフェースで宣言されたすべてのメソッドの本體を定義する必要があります。すべてを定義しない場合はそのクラスはabstractクラスと宣言される必要があります。 |
・ | インタフェースを実裝したクラスでは、インタフェースで宣言されたメンバ変數を「単純名」で參照できます。インタフェースを実裝していないクラスからは「インタフェース名.単純名」で參照する必要があります。 |
・ | インタフェースで定義されたメソッドを參照する場合、必ずそのインタフェースを実裝したクラスのオブジェクトを通して參照する必要があります。 |
【例1】インタフェースの実裝例です。 |
|
ExInterface3.javaファイル |
|
【解説1】 |
|
(1). | 國名が代入されたメンバ変數と挨拶を行うメソッドが定義されたHelloWorldインタフェースを作成します。 |
(2). | 國名が代入されたメンバ変數COUNTRYを定義します。 |
(3). | 挨拶を行うメソッドsayHelloのヘッダーを定義します。 |
(4). | クラスExInterface3を定義し、インタフェースHelloWorldの実裝を行います。 |
(5). | メソッドsayHelloの本體を定義します。ここでは引數xに指定された數だけ、printlnメソッドを繰り返すよう定義しています。 |
(6). | インタフェースで定義されたメンバ変數COUNTRYを參照しています。インタフェースを実裝しているため「単純名」で參照することができます。 |
(7). | クラスExInterface3のオブジェクトobject1を生成しています。 |
(8). | インタフェースで定義されたメソッドsayHelloを実行しています。実行はインタフェースを実裝したクラスExInterface3のオブジェクトを通して行っています。 |
【実行結果1】 |
|
インタフェース変數 |
インタフェースはクラス型のオブジェクト変數と同様にインタフェース型のインタフェース変數を作成することができます。インタフェース変數に代入できる値はそのインタフェースを実裝したクラスのオブジェクト変數のみです。これは以下のように言うこともできます。 |
・ | インタフェース変數に代入できるオブジェクト変數のオブジェクトは、そのインタフェースで定義されたメソッドの実裝が保証されている。 |
【例2】インタフェース変數の特徴をいかしたプログラムの例です。 |
|
ShowProfile.javaファイル |
|
ExInterface4.javaファイル |
|
インタフェース:ProfileInterface 以下のメソッドのヘッダーが定義されたインタフェース showDateメソッド:日付を表示 showNameメソッド:名前を表示 showAddressメソッド:住所を表示 クラス:ShowProfile インタフェースProfileInterfaceを実裝し、showDateメソッド、showNameメソッド、showAddressメソッドの本體を定義したクラス。 クラス:ExInterface4 showBasicメソッド:引數にインタフェース変數piをとるメソッド mainメソッド:クラスExInterface4のmainメソッド showBasicメソッドの引數に必ずインタフェースProfileInterfaceで定義されたメソッドを実裝したオブジェクトのオブジェクト変數を取りたいとします。このような場合に、メソッドshowBasicの引數の引數型をインタフェース型にします。このことにより、インタフェース変數piに代入可能なオブジェクトはすべてshowDate、showName、showAddressメソッドの実裝が保証されていると言うことができます。 |
【実行結果2】 |
|