>> Java入門トップに戻る
Javaのインターフェイスについて説明します。
インターフェイスとは抽象クラスと似ていて、「メソッドの宣言だけをまとめたクラスの骨格のようなもの」です。
インターフェイス自身はインスタンスを作成できず、このインターフェイスを他のクラスに「実装」することによって利用されます。
インターフェイスを実装したクラスは、「インターフェイスに宣言したメソッドを全て定義しなければならない」という決まりがあります。
つまりインターフェイスに宣言されているメソッドの実装を保証することが出来るわけです。
また、抽象クラスとは以下の点で違いがあります。
・インターフェイスには「抽象メソッドのみ宣言可能」で「通常のメソッドは定義不可」
・フィールドには定数のみ定義可能
・Javaでは複数のクラスの継承は不可だが、「インターフェイスは複数の実装が可能」
です。
定数というのは一度値を設定したら変更できないフィールドのことです。
インターフェイスに定義する定数は、具体的には修飾子に「public static final」というフィールドが付きます。
staticとfinalに関してはまた別のページで説明しますので、まぁそういうのがあるとだけ知っておいてください。
それでは実際にインターフェイスを作成してみましょう。
「NUMBERフィールド」は「定数」なので、この宣言時に値を代入しておく必要があります。
ここでは特に修飾子を書いていませんが、「インターフェイス内にフィールドを定義した場合、自動的にpublic static final修飾子が付加」されます。
別に最初から自分で書いていても構いません。
その下のechoHelloメソッドとechoOhayoメソッドは最初に説明したとおり宣言だけです。
このインターフェイスを実装したクラスで定義するので中身を書く必要が無いのです。
これらのメソッドにも修飾子はついてませんが、「インターフェイス内にメソッドを定義した場合、自動的にpublic abstract修飾子が付加」されます。
こちらも自分で最初から書いていても構いません。
なので自動的に付加される修飾子を考えた実際のインターフェイス部分のコードは以下のようになります。
さて、次のコードの説明に移ります。
31行目でインターフェイスをクラスに「実装」していますが、「implements」というキーワードが使われています。
この「implements」がインターフェイスを実装するときに必要なもので、「implements インターフェイス名」と書いて実装します。
最初に書きましたが、「インターフェイスは複数実装可能」なので、以下のように、
とカンマを続けて書くことで複数実装できます。
インターフェイスを実装したクラスSampleはインターフェイスTest内のメソッドを「全て」実装する義務があるので、echoHelloメソッドとechoOhayoメソッドを定義しています。
定義しないとエラーになりコンパイル出来ません。
7行目からはインターフェイスTestを実装したクラスSampleのインスタンスを作りメソッドを呼び出しています。
14行目ではフィールドNUMBERを呼び出していますが、アクセスの仕方が「Sample.NUMBER」と直接クラス名を書いてアクセスしています。
これはフィールドNUMBERに「static修飾子」が付いているためで、「static修飾子が付いているとインスタンスを作成しなくてもアクセス可能」なため、このような表記が可能なのです。
staticフィールドNUMBERには、インスタンスから「obj.NUMBER」と書いてもアクセス可能ですが、クラス名で書いたほうがstaticフィールドだと分かるため、「クラス名.フィールド名」の表記で書く方をお勧めします。
以上がインターフェイスの説明です。
抽象クラスと同じく使い所がわかりにくいかもしれませんが、「クラスにこれらメソッドを全て必ず定義してね!」って時に使うと良いかもしれません。
>> 【static修飾子 クラスフィールド、クラスメソッド】に進む
>> Java入門トップに戻る
インターフェイス interface
インターフェイスとは抽象クラスと似ていて、「メソッドの宣言だけをまとめたクラスの骨格のようなもの」です。
インターフェイス自身はインスタンスを作成できず、このインターフェイスを他のクラスに「実装」することによって利用されます。
インターフェイスを実装したクラスは、「インターフェイスに宣言したメソッドを全て定義しなければならない」という決まりがあります。
つまりインターフェイスに宣言されているメソッドの実装を保証することが出来るわけです。
また、抽象クラスとは以下の点で違いがあります。
・インターフェイスには「抽象メソッドのみ宣言可能」で「通常のメソッドは定義不可」
・フィールドには定数のみ定義可能
・Javaでは複数のクラスの継承は不可だが、「インターフェイスは複数の実装が可能」
です。
定数というのは一度値を設定したら変更できないフィールドのことです。
インターフェイスに定義する定数は、具体的には修飾子に「public static final」というフィールドが付きます。
staticとfinalに関してはまた別のページで説明しますので、まぁそういうのがあるとだけ知っておいてください。
それでは実際にインターフェイスを作成してみましょう。
package test4;
public class InterfaceTest {
public static void main(String[] args) {
Sample obj = new Sample();
obj.echoHello();
obj.echoOhayo();
//定数NUMBERを表示
System.out.println(Sample.NUMBER);
}
}
//インターフェイス定義
interface Test{
//定数
int NUMBER=100;
void echoHello();
void echoOhayo();
}
//インターフェイスTestを実装
class Sample implements Test{
@Override
public void echoHello() {
System.out.println("こんにちは");
}
@Override
public void echoOhayo() {
System.out.println("おはよう");
}
}
20行目からインターフェイスを定義しています。「NUMBERフィールド」は「定数」なので、この宣言時に値を代入しておく必要があります。
ここでは特に修飾子を書いていませんが、「インターフェイス内にフィールドを定義した場合、自動的にpublic static final修飾子が付加」されます。
別に最初から自分で書いていても構いません。
その下のechoHelloメソッドとechoOhayoメソッドは最初に説明したとおり宣言だけです。
このインターフェイスを実装したクラスで定義するので中身を書く必要が無いのです。
これらのメソッドにも修飾子はついてませんが、「インターフェイス内にメソッドを定義した場合、自動的にpublic abstract修飾子が付加」されます。
こちらも自分で最初から書いていても構いません。
なので自動的に付加される修飾子を考えた実際のインターフェイス部分のコードは以下のようになります。
interface Test{
//定数
public static final int NUMBER=100;
public abstract void echoHello();
public abstract void echoOhayo();
}
長いですし、自動で付加されるので無理に書かなくても大丈夫です。さて、次のコードの説明に移ります。
31行目でインターフェイスをクラスに「実装」していますが、「implements」というキーワードが使われています。
この「implements」がインターフェイスを実装するときに必要なもので、「implements インターフェイス名」と書いて実装します。
最初に書きましたが、「インターフェイスは複数実装可能」なので、以下のように、
class Sample implements Test,Test2,Test3,Test4
とカンマを続けて書くことで複数実装できます。
インターフェイスを実装したクラスSampleはインターフェイスTest内のメソッドを「全て」実装する義務があるので、echoHelloメソッドとechoOhayoメソッドを定義しています。
定義しないとエラーになりコンパイル出来ません。
7行目からはインターフェイスTestを実装したクラスSampleのインスタンスを作りメソッドを呼び出しています。
14行目ではフィールドNUMBERを呼び出していますが、アクセスの仕方が「Sample.NUMBER」と直接クラス名を書いてアクセスしています。
これはフィールドNUMBERに「static修飾子」が付いているためで、「static修飾子が付いているとインスタンスを作成しなくてもアクセス可能」なため、このような表記が可能なのです。
staticフィールドNUMBERには、インスタンスから「obj.NUMBER」と書いてもアクセス可能ですが、クラス名で書いたほうがstaticフィールドだと分かるため、「クラス名.フィールド名」の表記で書く方をお勧めします。
以上がインターフェイスの説明です。
抽象クラスと同じく使い所がわかりにくいかもしれませんが、「クラスにこれらメソッドを全て必ず定義してね!」って時に使うと良いかもしれません。
>> 【static修飾子 クラスフィールド、クラスメソッド】に進む
>> Java入門トップに戻る













