使用接口引用访问java Object类方法

时间:2013-10-19 18:09:37

标签: java inheritance interface

让我们考虑以下示例。

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的方法,考虑到我的具体类中的其他方法是不允许的?

2 个答案:

答案 0 :(得分:9)

  

为什么允许它通过接口引用

访问类Object的方法

您可以使用接口引用调用Object类方法,尽管接口不会从Object类扩展,因为Java中的每个根接口都有对应于{的每个方法的隐式方法声明{1}}上课。

  

JLS §9.2 - Interface members

     

界面的成员是:

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

答案 1 :(得分:1)

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