インタフェースのメソッド宣言

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());
	}
}
C:\Java>javac GreetTest.java
C:\Java>java GreetTest
ご機嫌如何ですか?
ぼちぼちだな。
C:\Java>

間違った例

ここで挙げるのはコンパイルエラーの例です。

インタフェース側での間違い

interface ErrInterface {
	// public 以外は不可
	protected int msg1();
	// 抽象メソッド以外は不可
	String msg2() {
		return "メッセージ2";
	}
}
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() {}
}


Copyright © 2002-2003 SUGAI, Manabu. All Rights Reserved.