この文章は下記のアドレスで記載されています。
http://www.javaroad.jp/java_interface1.htm
●
インタフェース-
1.はじめてのインタフェース
このページではJavaでのインタフェースの概要について説明をします。 |
<!-- */タイトル* --><!-- *インタフェースの特徴・利点* -->
インタフェースの特徴・利点 |
インタフェースとは、ある特定の機能の概要を記述したものです。インタフェースを実装したクラスは、同一のインタフェースを実装したクラスとの間においてある特定の機能の概要を共通に持ちます。機能概要の詳細はそれぞれのクラスで定義します。 |
インタフェースの利点の1つとしてクラスが複数のインタフェースを実装できると言うのがあります。ある特定の機能の概要をクラスに実装する方法としてextendsを使用してスーパークラスを継承すると言う方法もあります。しかしこの場合複数のスーパークラスを継承することはできません。Javaでは複数のスーパークラスの継承(多重継承)が認められていないためです。
また、extendsによりスーパークラスを継承すると言うことは継承したサブクラスと継承されたスーパークラスの間にクラス関係を持つと言うことになります。スーパークラスとサブクラスの間にクラス関係が見受けられない場合においてもこのような継承を行うことはクラス設計上不適切です。このような場合はインタフェースを使用します。インタフェースの実装はクラス関係に依存しません。
【クラスの継承を利用した場合】 |
<!-- /*インタフェースの特徴・利点* --><!-- *BTN* -->
<!-- /*BTN* --><!-- *インタフェースの使用例* -->
<!-- /*インタフェースの使用例* --><!-- *BTN* -->
<!-- /*BTN* --><!-- *LittleNavi* -->
●
インタフェース-
2.インタフェースの宣言(interface)
このページではJavaでのインタフェースの宣言方法について説明します。 |
<!-- */タイトル* --><!-- *インタフェースの宣言* -->
インタフェースの宣言 |
インタフェースの宣言は以下の枠内のフォーマットにより構成されます。interfaceとインタフェース名は必須項目です。 |
public interface インタフェース名 extends スーパーインタフェース名,・・・ |
|
修飾子
|
説明
|
public
|
インタフェースのアクセスレベルを指定します。publicがなければインタフェースと同じパッケージ内で定義されたクラスのみからアクセスできることを表します。publicがあれば全クラスからアクセスできることを表します。
|
interface
|
インタフェースの宣言を意味します。インタフェース宣言時の必須項目です。
|
インタフェース名
|
宣言されたインタフェースのインタフェース名を意味します。インタフェース宣言時の必須項目です。
|
extends
|
スーパーインタフェース名を継承したい時に使用します。
|
スーパーインタフェース名
|
継承したいスーパーインタフェース名です。スーパーインタフェース名は,(カンマ)により複数宣言することができます。
|
|
メンバ変数、メソッドの宣言 |
インタフェース内でメンバ変数を宣言する場合、そのメンバ変数は暗黙的にpublic、static、finalの修飾子が付与されます。final修飾子が付与されることからもインタフェース内で宣言されたメンバ変数は定数と言うことができます。メンバ変数宣言時に明示的にこれらの修飾子を付与する必要はありません。
インタフェース内でメソッドを宣言する場合、そのメソッドは暗黙的にpublic、abstractの修飾子が付与されます。abstract修飾子が付与されていることからもインタフェース内で宣言されたメソッドは抽象メソッドと言うことができます。メソッド宣言時に明示的にこれらの修飾子を付与する必要はありません。抽象メソッドであるため、インタフェース内でメソッドを宣言する場合、メソッドのヘッダー部分のみを宣言します。メソッド本体の定義はインタフェースを実装したクラス内で行います。 |
インタフェース内でメンバ変数、メソッドを宣言する場合、修飾子としてtransient、volatile、synchronizeを付与することはできません。またアクセスレベルとして、private、protectedを付与することもできません。 |
//インタフェースExInterface2の宣言
interface ExInterface2 {
//引数にdouble型の引数dを持つメソッドexMethodの宣言
void exMethod(double d);
//double型の定数EXMEMBERの宣言
double EXMEMBER = 100.256d;
} |
|
<!-- /*インタフェースの宣言* --><!-- *BTN* -->
<!-- /*BTN* --><!-- *インタフェースとabstractクラスの違い* -->
インタフェースとabstractクラスの違い |
インタフェースを実装したクラスでメソッドの本体を定義すると言うことを考えると、abstractクラスを継承したクラスでabstractメソッドの本体を定義するというのとよく似ています。インタフェースとabstractクラスには以下に示すような違いがあります。 |
・ |
インタフェースではどのメソッドも本体を定義することはできませんが、abstractクラスには本体を定義したメソッド(abstractでないメソッド)を含めることができます。 |
・ |
インタフェースは複数実装できますが、abstractクラスは1つのみしか継承できません(多重継承がサポートされていないため)。 |
・ |
abstractクラスは継承したクラスとの間にクラス関係を意識する必要がありますが、インタフェースは実装したクラスとの間にクラス関係を意識する必要はありません。 |
<!-- /*インタフェースとabstractクラスの違い* --><!-- *BTN* -->
<!-- /*BTN* --><!-- *LittleNavi* -->
●インタフェース-3.インタフェースの実装(implements)
このページではインタフェースの実装方法について説明します。 |
<!-- */タイトル* --><!-- *インタフェースの宣言* -->
<!-- /*インタフェースの宣言* --><!-- *BTN* -->
<!-- /*BTN* --><!-- *インタフェースとabstractクラスの違い* -->
<!-- /*インタフェースとabstractクラスの違い* --><!-- *BTN* -->
<!-- /*BTN* --><!-- *LittleNavi* -->