2011-10-02 153 views
3

是否有任何Java接口隱式實現java.lang.Object?Java接口實現對象?

這個問題出現了,當我做了這樣的事情:

public static String[] sizeSort(String[] sa) { 

Comparator<String> c = new Comparator<String>() { 
      public int compare(String a, String b) { 
       if (a.length() > b.length()) return 1; 
       else if (a.length() < b.length()) 
        return -1; 
       else 
        return 0; 
       } 
     }; 

// more code 

} 

它,即使我沒有實現相當於此接口的方法工作得很好。 你的答案清除了這一點。但是,有沒有人知道如果上面是匿名的本地內部類或命名的本地內部類?

+0

這是一個匿名的內部類,因爲它沒有名字。 –

+0

雖然下面有一些很好的答案,但請考慮這一點:'class X {}' - 不需要定義'equals';爲什麼?對於實現接口的匿名類也是如此:所有類聲明不隱式擴展另一個類擴展對象(因此所有的類直接或間接擴展對象)。 – 2011-10-02 22:55:17

回答

7

排序援引Java Language Specification

如果接口沒有直接 超接口,則接口 隱式地聲明公共抽象 構件方法米與簽名s, 返回類型r和throws子句噸 對應給每個公開實例 方法 m帶簽名s,返回類型 r,並拋出子句t 在 中聲明對象,除非有相同的方法 簽名,相同的返回類型和 兼容的throws子句明確地由接口聲明的 。如果接口顯式地 在 的情況下聲明瞭這樣一種方法m,那麼這是一個編譯時錯誤,其中m在 對象中聲明爲final。

注意Object有一些最終和受保護的方法,所有的接口「繼承」這樣一來,你不能在一個接口的修飾符(這將通過您的「實現的java.lang暗示。目的」)。

+0

+1有趣的摘錄/查找。我不知道JLS「提升」了對象契約的接口。我想這是明確規定能夠討論這種方法的「陰影」。 – 2011-10-02 22:51:22

+0

+1這很有趣,它也有意義,否則你怎麼能在界面上調用hashCode? –

6

java.lang.Object不是接口,所以沒有接口會隱含地實現它。

但是,您創建的任何實現任何接口的類都將擴展Object,因爲所有類都必須擴展它。因此,您(或其他任何人)可以創建的任何實例都將擁有在java.lang.Object上定義的所有方法。

1

嚴格地說:你怎麼知道它們的區別? 你永遠不會有一個接口的引用,你將始終引用一個實際的實例,並且是一個Object並實現該接口。這意味着即使參考的聲明類型是接口,您也可以在任何參考(當然不是null)上調用Object的方法。

+0

但是你的引用的聲明類型可以是一個接口,那麼當它不是接口的一部分時,你怎麼能調用equals()呢? –

+2

因爲Java知道它也是'Object'嗎? –

+0

這個問題似乎是關於Java如何「知道」的。 –

2

Object是一個類,不是接口,所以它不能被其他接口「實現」。

接口的要點是它沒有實現細節。如果一個接口可以擴展一個類,它將會繼承該類的實現細節,這將破壞這一點。