2012-09-17 53 views
2

對不起,帶回dead。但是我仍然不清楚這部分規範的內容。試圖瞭解隱式超接口

如果接口沒有直接超接口,則接口 隱式聲明與簽名 S,返回類型爲r的公共抽象成員方法米,並拋出對應於每個公共 實例方法米與簽名s子句噸,返回類型爲r,並拋出在Object中聲明的子句t ,除非具有相同簽名的方法,返回類型相同的 以及由接口 明確聲明兼容的throws子句。如果接口明確聲明 在m聲明爲對象中的最終 的情況下聲明瞭這樣的方法m,則會導致編譯時錯誤。

鑑於

interface Testing 
{ 
    void test(); 
} 
public class Test{ 
    public static void main(String[] args) { 
     Testing t = new Testing(){ 
      @Override 
      public void test(){ 
      } 
     }; 
     t.test(); 
     t.toString(); 
    } 
} 

現在的規範指出,上述將變爲

interface Testing 
    { 
     void test(); 
     String toString(); 
     //other non-final methods of Object 
    } 
    public class Test{ 
     public static void main(String[] args) { 
      Testing t = new Testing(){ 
       @Override 
       public void test(){ 
       } 
      }; 
      t.test(); 
      t.toString(); 
     } 
    } 

也。請確認是否存在接口的層次結構,然後全部獲得這些抽象方法。

+1

你的問題到底是什麼?每個類都繼承Object的方法而不管實現的接口 – Hachi

+0

我的問題是 - 「我的理解是正確的嗎?」另外「這有什麼必要?」 – John

+0

是的,你的理解是正確的。只要你有明確或隱含的接口方法。使用它們的其他類或接口並不重要 – sasidhar

回答

0

只要沒有接口的超級接口,它就會獲得Object類方法的隱式聲明。只要這些方法包含在界面中即可。每個擴展或實現這個接口的接口在這個接口顯式聲明的方法或隱式獲取的方法之間沒有看到太大的區別。這一點表明,接口和明確聲明一樣好。

1

這意味着每個類都會擴展Object(在其類中的某個點上是heirarchy)。但是,接口不會擴展Object。這是爲了避免由於多次擾亂而引起的問題。

由於接口不擴展Object,這意味着如果我們訪問的對象的類型(不是類)是接口,我們就無法使用像toString這樣的方法。但是我們知道這些方法必須是可用的,因爲所有類都在Object之間。因此,爲了解決這個問題,所有的Object不是最終的方法都在沒有超接口的所有接口中隱式聲明。這些方法的這些合同總是得到滿足,因爲所有類別必須在某一點從Object延伸。

TL; DR - 這是一個把戲,以確保我們可以通過Object訪問可用的方法時,我們必須存儲在變量的類型有些類的一個實例是一個接口(例如Serializable

編輯:要回答你的問題,你稍微偏離。所有非終極方法Object被添加到一個接口(不管它們是否被使用),如果該接口沒有父接口AND,則添加每個方法:接口沒有明確聲明匹配的方法。

+0

我認爲OP的問題是'請確認是否有接口的層次結構,然後所有這些接口都得到這些抽象方法?我錯過了什麼? – sasidhar

+0

@sasidhar:那是我的第二個問題 – John