2 回答

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

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