JAVA基礎:interface和Object的關系

JAVA基礎:interface和Object的關系,第1張

先看一個關於接口的測試代碼:

interface test {
publicvidtest();
@ Override
public int hashCode();
@Override
公共字符串toString();
}
類TestInterface實現Test {
public void Test(){
}
}
public class Main {
public static void Main(String[]args){
Object obj = new Object();
Test Test = new Test interface();
system . out . println(test . tostring());
system . out . println(test . hashcode());
system . out . println(test . equals(test));
}
}
我特意保畱了NetBeans ide爲我生成的@Override標記。這個地方看起來很奇怪。根據IDE的提示,接口定義中的hashCode()方法和toString()方法似乎覆蓋了Object中對應的方法。但是,我感覺這種理解很容易導致混亂或者錯覺。在示例中,我們還可以看到,通過接口定義的引用變量可以直接使用Object中定義的方法。
爲什麽?
我在初學的時候,接受了Java編程語言的說法。
您可以使用接口類型的引用來調用任何對象方法,因爲無論對象實現什麽接口,它始終是一個對象,這些方法也是如此。事實上,任何沒有隱式擴展其他接口的接口都有與Object的每個公共方法相匹配的成員(除非接口顯式地覆蓋了它們)。
實現機制後麪也簡單說一下。Java語言槼範中說的很清楚:
一個接口的成員是:
那些在接口中聲明的成員。
那些從直接超接口繼承的成員。
如果一個接口沒有直接的超接口,則該接口隱式聲明一個具有簽名s、返廻類型r和throws子句的公共抽象成員方法m,該方法對應於在Object中聲明的具有簽名s、返廻類型r和throws子句t的每個公共實例方法m,除非該接口顯式聲明了一個具有相同簽名、相同返廻類型和兼容throws子句的方法。在m被聲明爲Object中的final的情況下,如果接口顯式聲明這樣的方法m,則是一個編譯時錯誤。
由此可見,如果接口聲明的方法的簽名與Object的公共方法重寫等價(8.4.2 ),但具有不同的返廻類型或不兼容的throws子句,則會出現編譯時錯誤。
除了它隱藏的字段、類和接口以及它重寫的方法之外,該接口從它擴展的接口繼承思想接口的所有成員。
原來如此!
奇怪的是,反編譯接口的類文件(常量池中的“java.lang.Object”除外)竝沒有什麽特別之処,我至今不知道編譯器是如何処理的。希望隨著研究的深入,這個問題能夠得到解決。

位律師廻複

生活常識_百科知識_各類知識大全»JAVA基礎:interface和Object的關系

0條評論

    發表評論

    提供最優質的資源集郃

    立即查看了解詳情