Revised: Feb./14th/2003; Since: Apr./6th/2002
インタフェースは、メソッドが全て抽象メソッドである特殊なクラスのようなものです。オブジェクトの外部に公開するメソッド、オブジェクトのインタフェース、実装の無い宣言だけのメソッド、型適合だけを提供する仕組みだといえます。
インタフェースはクラスで実装されることで利用されますが、実装クラス側では、インタフェースの全ての抽象メソッドを実装する必要があります。自動的に修飾子 public abstract が付加されますので、それ以外の修飾子をインタフェースのメソッド宣言で指定することは誤りであり、実装クラスでそれ以外の修飾子を記述しても、これもまた誤りです。
GreetTest.java:
// インタフェース
interface Greeting {
String greeting();
String reply();
}
// 実装クラス
class GreetImple implements Greeting {
// 実装メソッド
public String greeting() {
return "ご機嫌如何ですか?";
}
// 実装メソッド
public String reply() {
return "ぼちぼちだな。";
}
}
// コントロールクラス
class GreetTest {
public static void main(String[] args) {
GreetImple obj = new GreetImple();
System.out.println(obj.greeting());
System.out.println(obj.reply());
}
}
public 修飾子を付ける必要があります。C:\Java>javac GreetTest.java C:\Java>java GreetTest ご機嫌如何ですか? ぼちぼちだな。 C:\Java>
ここで挙げるのはコンパイルエラーの例です。
interface ErrInterface {
// public 以外は不可
protected int msg1();
// 抽象メソッド以外は不可
String msg2() {
return "メッセージ2";
}
}
public 以外のアクセス修飾子は間違いです。
C:\Java>javac ErrInterface.java
ErrInterface.java:5: インタフェースメソッドが本体を持つことはできません。
String msg2() {
^
ErrInterface.java:3: 修飾子 protected をここで使うことはできません。
protected int msg1();
^
ErrInterface.java:5: インタフェースメソッドが本体を持つことはできません。
String msg2() {
^
エラー 3 個
C:\Java>
public 修飾子は必須
// インタフェース
interface Interface {
// 自動的に public 宣言されている
String hello();
}
// 実装クラス
class ErrTest implements Interface {
// public 修飾子をつける必要がある
String hello() {
return "こんにちは。";
}
}
実装クラスでの hello() メソッドの実装には、アクセス修飾子が何もつけられていません。アクセス修飾子の省略は、同じパッケージ内からのアクセス以外は許さないので、全てのアクセスを許可する public 修飾子と矛盾します。
C:\Java>javac ErrImple.java
ErrImple.java:7: ErrTest の hello() は Interface の hello() を実装できません。ス
ーパークラスでの定義より弱いアクセス特権 (public) を割り当てようとしました。
class ErrTest implements Interface {
^
エラー 1 個
C:\Java>
インタフェースの抽象メソッドを実装するときは、 public 修飾子が必須です。
// インタフェース
interface Interface {
String hello();
void bye();
}
// 実装クラス
class ErrImple implements Interface {
// hello() メソッドの実装
public String hello() {
return "こんにちは";
}
// bye() メソッドを実装していない
}
C:\Java>javac ErrImple.java
ErrImple.java:6: ErrImple は abstract として宣言する必要があります。bye() を Err
Imple で定義しません。
class ErrImple implements Interface {
^
エラー 1 個
C:\Java>
インタフェースの全てのメソッドを実装しないと、上のようなエラーが出ます。インタフェースの一部だけ実装すればよい場合は、次のように空の実装をしておきます:
interface Interface {
String hello();
void bye();
}
class ErrImple implements Interface {
public String hello() {
return "こんにちは";
}
// 空の実装
public void bye() {}
}