1

重複の可能性:
インターフェイスはJavaのオブジェクトクラスから継承しますか

package inheritance;
class A{
   public String display(){
       return "This is A!";
   }
}

interface Workable{
   public String work();
}

class B extends A implements Workable{
   public String work(){
      return "B is working!";
   }
}

public class TestInterfaceObject{
   public static void main(String... args){
      B obj=new B();
      Workable w=obj;
      //System.out.println(w.work());
      //invoking work method on Workable type reference

      System.out.println(w.display());
      //invoking display method on Workable type reference

      //System.out.println(w.hashCode());
      // invoking Object's hashCode method on Workable type reference
    }
}

呼び出すことができるメソッドは、呼び出す参照変数の型に依存することがわかっています。ここで、コードでは、work() メソッドが "w" 参照 (Workable 型) で呼び出されたため、メソッド呼び出しは正常にコンパイルされます。次に、「w」でdisplay()メソッドが呼び出され、displayメソッドが見つからないというコンパイルエラーが発生します。これは、Workableが認識していないため明らかです。次に Object クラスのメソッド、つまり hashCode() を呼び出して、コンパイルと実行を成功させようとします。それはどのように可能ですか?論理的な説明はありますか?

4

3 に答える 3

4

直感的な答えは、参照するインターフェイスに関係なく、インターフェイスを実装するオブジェクトは のサブクラスでなければならないということですObject

JLS のセクション 9.2 は、この動作を明確に定義しています: http://docs.oracle.com/javase/specs/jls/se7/html/jls-9.html#jls-9.2

インターフェイスに直接のスーパーインターフェイスがない場合、インターフェイスは、署名 s、戻り値の型 r、および throws 句 t を持つ各パブリック インスタンス メソッド m に対応する、シグネチャ s、戻り値の型 r、および throws 句 t を持つパブリック抽象メンバー メソッド m を暗黙的に宣言します。ただし、同じシグネチャ、同じ戻り値の型、および互換性のある throws 句を持つメソッドがインターフェイスによって明示的に宣言されている場合を除きます。

つまり、すべてのインターフェイスには、クラス内のメソッドに対応するメソッド シグネチャが含まれていると想定されますObject

于 2012-07-09T03:13:34.843 に答える
2

ここで何が起こっているかというと、 は であることwがわかっているだけですがWorkable、すべてのオブジェクトは から派生する必要があるため、最終的にObjectどのクラスであっても、メソッドを持っている必要があります。wObject

于 2012-07-09T02:35:00.677 に答える
1

機能しない理由w.display()は、参照をインターフェイス タイプとして保存したためです。コンパイラは、インターフェイスによって公開されたメソッドのみを認識します。これを呼び出すとうまくいきます((B)w).display()hashCode()インターフェイスがオブジェクトによって継承され、すべてのオブジェクトのスーパークラスがObject

于 2012-07-09T02:35:19.477 に答える