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 实现了一些带有通知、等待等方法的接口)。我的问题是,为什么允许通过接口引用访问类 Object 的方法,考虑到我的具体类中的其他方法是不允许的?

4

2 回答 2

10

为什么允许Object通过接口引用访问类的方法

Object尽管接口不是从类扩展的,但您可以使用接口引用来调用类方法Object,因为 Java 中的每个根接口都隐式声明了与类的每个方法相对应的方法Object

JLS §9.2 - 接口成员

接口的成员是:

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

这是因为 Java 确保任何实现了X接口的类也肯定是 Object 类,因此可以调用wait(),notify()和其他 Object 家伙。

于 2013-10-19T18:14:12.180 回答