1

可能重复:
接口是否继承自 java 中的 Object 类

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() 方法,这会产生一个编译错误,表明未找到显示方法,这很明显,因为 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

如果接口没有直接的超接口,则接口隐式声明一个公共抽象成员方法 m,其签名为 s,返回类型为 r,并且 throws 子句 t 对应于每个签名为 s、返回类型为 r 和 throws 子句的公共实例方法 m在 Object 中声明,除非接口显式声明了具有相同签名、相同返回类型和兼容 throws 子句的方法。

即假定所有接口都包含与类中的方法相对应的方法签名Object

于 2012-07-09T03:13:34.843 回答
2

我认为这里发生的事情是,即使w只知道是Workable,所有对象都必须派生自Object,所以无论w最终是什么类,它都必须有Object方法。

于 2012-07-09T02:35:00.677 回答
1

w.display()不起作用的原因是您将参考保存为您的界面类型。编译器只看到接口公开的方法。如果你打电话给((B)w).display()这会工作。您可以调用hashCode(),因为编译器足够聪明,知道接口是由对象继承的,并且所有对象的超类都是Object

于 2012-07-09T02:35:19.477 回答