2013-10-19 83 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類方法的接口引用。 –