2 回答

TA貢獻1995條經驗 獲得超2個贊
接口不用于定義調用什么方法。
接口的主要功能之一是將 API 與實現分離。例如,這意味著任何實現 Runnable 的類都可以用于在并行線程中運行。另一種是在繼承范圍之外定義一個類的類型。
來自有效java的引用:
Java 編程語言提供了兩種機制來定義允許多種實現的類型:接口和抽象類。這兩種機制之間最明顯的區別是允許抽象類包含某些方法的實現,而接口則不允許。一個更重要的區別是,要實現抽象類定義的類型,類必須是抽象類的子類。任何定義了所有必需方法并遵守通用約定的類都可以實現接口,無論該類位于類層次結構中的哪個位置。因為 Java 只允許單繼承,所以對抽象類的這種限制嚴重限制了它們作為類型定義的使用
通過實現 Runnable 接口,您不會告訴代碼應該調用 run 方法。您正在告訴代碼您的類是 Runnable 的一種類型,或者從字面上看,您的類是可運行的。
如果您要使用抽象類,則可以使用一個示例用法:Plant
. 現在您將使用這個類來定義植物的一些常見屬性(例如它們需要土壤),然后您將創建它的子類Potato
, Rosemary
,Dandelion
現在假設你想指出這些植物中的哪一種是可食用的,你可以創建一個中間子類EdiblePlant
,它是 Plant 的子類和可食用類的超類。EdiblePlant
有一個方法叫做eat()
,因此你可以吃所有可食用的植物。
現在,如果您還想擁有一個類Animal
及其子類Dog
, Cow
, Pig
. 您將再次必須指出哪個可以被新的中間類食用,EdibleAnimal
它又會有一個eat()
方法。
我想這似乎沒有那么多工作,但現在如果你想擁有Human
,誰吃?
你必須同時擁有Human.eat(EdibleAnimal animal);
方法和Human.eat(EdiblePlant plant)
方法。因為我們可以同時吃這兩個。
相反,我們可以定義一個Edible
具有方法的接口eat()
。這種類型表明實現這種類型的類(植物和動物)實際上可以被吃掉。
既然現在我們有一個可食用的通用類型,我們可以簡單地在 Human 上使用一種吃方法,Human.eat(Edible food)
由于我們現在有一個分離的接口和實現,我們不再考慮如何重構/添加新方法Human
,我們只需要適當地實現Edible
類型。
我建議在開始 Android 開發之前閱讀 Java 的工作原理,如果你不這樣做,你可以形成這些關于事物如何工作的糟糕理論模型,例如,interface determines what methods will be called
當它與 Java 的實際工作原理發生沖突時,你會感到沮喪,并且不明白為什么你寫的東西不像“預期的”那樣工作。

TA貢獻1798條經驗 獲得超7個贊
兩個接口可以具有相同的“內容”,例如相同數量的方法和匹配的方法簽名。
由于名稱不同,它們仍然不同。您甚至可能有同名的接口(或類?。皇窃诎Q上有所不同。例如,有多個名為 Pair 的不同類。
但是接口并不能確定調用了哪些方法。你編寫的代碼選擇一個方法并調用它,而某個類實現了一個特定接口的事實只是告訴你:“好的,它是一個 Runnable,所以我可以并且可能想要調用它的 run 方法”。
你看,Java 是一種靜態編譯的語言。這意味著您使用類型來傳達意圖。您有一些代碼應該由統一的,可能是多線程的上下文中的其他代碼自己調用?然后您考慮將該代碼放入 Runnable 中。這就是全部。
添加回答
舉報