2013-10-19 51 views
4

让我们考虑下面的示例。使用接口引用访问java对象类方法

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

回答

9

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

您可以调用使用接口引用Object类方法虽然接口不从Object类扩展,因为每Java中的根接口具有对应于Object类的每种方法的隐式声明方法。

JLS §9.2 - Interface members

的接口的成员是:

  • 如果接口没有直接超接口,则接口 隐式声明与签名 个公共抽象成员方法米,返回类型为r,并且抛出对应于每个公开的实例方法m的子句t,其中签名为s,返回类型为r,并抛出在Object中声明的子句t ,除非具有相同签名的方法,相同的 返回类型,并且兼容的throws子句由 接口明确声明。
+0

谢谢。我认为这是可以接受的答案。所以,这意味着在Java中,任何接口都具有类Object的“隐藏声明”方法,对吗? – sergeyan

+0

@sergeyan是的。究竟。 –

1

这是因为Java确保已实现的X接口的任何类是绝对是一个Object类也一样,所以这是可以调用的wait()notify()和其他对象的家伙。

+0

OP关注访问Object类方法的接口引用。 –