抽象類和介面的區別

來源:酷知科普網 1.98W

許多朋友搞不懂Java中抽象類和藉口的區別,今天我們就來分析一下。

操作方法

(01)介面,在表面上是由幾個沒有主體程式碼的方法定義組成的集合體,有唯一的名稱,可以被類或其他介面所實現(或者也可以說繼承)。

抽象類和介面的區別

(02)介面是一組規則的集合,它規定了實現本介面的類或介面必須擁有的一組規則。體現了自然界“如果你是……則必須能……”的理念。介面是在一定粒度檢視上同類事物的抽象表示。注意這裡我強調了在一定粒度檢視上,因為“同類事物”這個概念是相對的,它因為粒度檢視不同而不同。

(03)關於抽象類與介面,如果單從具體程式碼來看,對這兩個概念很容易模糊,甚至覺得介面就是多餘的,因為單從具體功能來看,除多重繼承外(C#,Java中),抽象類似乎完全能取代介面。但是,難道介面的存在是為了實現多重繼承?當然不是。抽象類和介面的區別在於使用動機。使用抽象類是為了程式碼的複用,而使用介面的動機是為了實現多型性。所以,如果你在為某個地方該使用介面還是抽象類而猶豫不決時,那麼可以想想你的動機是什麼。

(04)總而言之,介面與抽象類的區別主要在於使用的動機,而不在於其本身。而一個東西該定義成抽象類還是介面,要根據具體環境的上下文決定。再者,介面和抽象類的另一個區別在於,抽象類和它的子類之間應該是一般和特殊的關係,而介面僅僅是它的子類應該實現的一組規則。(當然,有時也可能存在一般與特殊的關係,但我們使用介面的目的不在這裡)如,交通工具定義成抽象類,汽車、飛機、輪船定義成子類,是可以接受的,因為汽車、飛機、輪船都是一種特殊的交通工具。再譬如Icomparable介面,它只是說,實現這個介面的類必須要可以進行比較,這是一條規則。如果Car這個類實現了Icomparable,只是說,我們的Car中有一個方法可以對兩個Car的例項進行比較,可能是比哪輛車更貴,也可能比哪輛車更大,這都無所謂,但我們不能說“汽車是一種特殊的可以比較”,這在文法上都不通。

(05)Android中ListView作為開發最常用的元件之一,我們經常要使用自定義的Adapter來達到我們的目的,因此寫一個自己的BaseAdapter是很常見的事情,而重寫BaseAdapter的目的就是為了少寫重複程式碼和實現自己想要的getview()函式,這裡我們看看這個抽象類:

抽象類和介面的區別 第2張

(06)我們再來看看介面,介面的目的是為了讓實現介面的物件一不同方式實現同一方法,而不是為了減少重複程式碼,這裡舉一個Cache的程式碼,這一介面是制定了快取物件的規則,即實現快取的物件必須要實現接口裡定義的方法,這樣才能保證快取功能的完整:

抽象類和介面的區別 第3張
熱門標籤