4

次の例を考えてみましょう。

public interface SimpleInterface {
    public void simpleMethod();
}

public class SimpleClass implements SimpleInterface{

 public static void main(String[] args) {
     SimpleInterface iRef = new SimpleClass();
     SimpleClass cRef = new SimpleClass();
     iRef.simpleMethod(); // Allowed. Calling methods defined in interface via interface reference.
     cRef.specificMethod(); // Allowed. Calling class specific method via class reference.
     iRef.specificMethod(); // Not allowed. Calling class specific method via interface reference.
     iRef.notify(); // Allowed????

 }

 public void specificMethod(){}

 @Override
 public void simpleMethod() {}

}

インターフェース参照を使用するJavaでは、このインターフェースで定義されているメソッドにのみアクセスできると思いました。ただし、クラス Object のメソッドには、任意のインターフェイス参照を介してアクセスできるようです。私の具象クラス「SimpleClass」は、クラス Object が持つすべてのメソッドを継承し、間違いなく、クラス Object はインターフェイスを実装していません (Object は、notify、wait などのメソッドを備えたインターフェイスを実装していると想定されます)。私の質問は、具象クラスの他のメソッドが許可されていないことを考慮して、なぜインターフェイス参照を介してクラス Object のメソッドにアクセスできるのですか?

4

2 に答える 2

10

Objectインターフェイス参照を介してクラスのメソッドにアクセスできる理由

Java のすべてのルート インターフェイスには、クラスの各メソッドに対応するメソッドの暗黙的な宣言があるため、インターフェイスはクラスObjectから拡張されませんが、インターフェイス参照を使用してクラス メソッドを呼び出すことができます。ObjectObject

JLS §9.2 - インターフェイス メンバー:

インターフェイスのメンバーは次のとおりです。

  • インターフェイスに直接のスーパーインターフェイスがない場合、インターフェイスは、シグネチャ s、戻り値の型 r、および throws 節 t を持つ各パブリック インスタンス メソッド m に対応する、シグネチャ s、戻り値の型 r、および throws 節 t を持つパブリック抽象メンバー メソッド m を暗黙的に宣言します。同じシグネチャ、同じ戻り値の型、および互換性のある throws 句を持つメソッドがインターフェイスによって明示的に宣言されていない限り、Objectで宣言されています。
于 2013-10-19T18:13:27.767 に答える
1

これは、Java がXインターフェイスを実装したクラスも確実に Object クラスでwait()あることを保証するためnotify()です。

于 2013-10-19T18:14:12.180 に答える