1. 程式人生 > 資訊 >“毅力”號探測器拍攝火星日落照片:顏色絕美

“毅力”號探測器拍攝火星日落照片:顏色絕美

抽象類和介面

抽象類和介面的定義:

抽象類(abstract class):

使用abstract修飾符修飾的類。(如果一個類沒有包含足夠多的資訊來描述一個具體的物件,這樣的類就是抽象類。)

抽象方法:只宣告,不實現。具體的實現由繼承它的子類來實現。實際點就是:被abstract修飾的方法,只有方法名沒有方法實現,具體的實現要由子類實現。方法名後面直接跟一個分號,而不是花括號。例如:public abstract int A();

一個類中含有抽象方法(被abstract修飾),那麼這個類必須被宣告為抽象類(被abstract修飾)。

介面(interface):

定義:介面在java中是一個抽象型別,是抽象方法的集合。一個類通過繼承介面的方式,從而繼承介面的抽象方法。從定義上看,介面是個集合,並不是類。類描述了屬性和方法,而介面只包含方法(未實現的方法)。

介面和抽象類一樣不能被例項化,因為不是類。但是介面可以被實現(使用 implements 關鍵字)。實現某個介面的類必須在類中實現該介面的全部方法。雖然介面內的方法都是抽象的(和抽象方法很像,沒有實現)但是不需要abstract關鍵字。

介面中沒有構造方式(因為介面不是類) 介面中的方法必須是抽象的(不能實現) 介面中除了static、final變數,不能有其他變數 介面支援多繼承(一個類可以實現多個介面)

抽象類和介面的區別:

1.預設的實現方法:

(1)抽象類可以有預設的方法實現完全是抽象的。

抽象類中可以有已經實現了的方法,也可以有被abstract修飾的方法(抽象方法),因為存在抽象方法,所以該類必須是抽象類。

(2)介面根本不存在方法的實現。

但是介面要求只能包含抽象方法,抽象方法是指沒有實現的方法。介面就根本不能存在方法的實現。

2.子類使用的關鍵詞不一樣:

(1)實現抽象類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有宣告的方法的實現。

抽象類雖然不能例項化來使用,但是可以被繼承,讓子類來具體實現父類的所有抽象方法。但是如果子類將抽象方法沒有全部實現,就必須把自己也修飾成抽象類,交於繼承它的子類來完成實現。以此類推,直到沒有抽象函式。

(2)子類使用關鍵字implements來實現介面。它需要提供介面中所有宣告的方法的實現。

介面的實現,通過implements關鍵字。實現該介面的類,必須把介面中的所有方法給實現。不能再推給下一代。

3.是否有構造器:

(1)抽象類可以有構造器

抽象類是屬於類,享有類的所有特性(但是不能例項化),當然包括類的構造方法,也就是構造器。

(2)介面不能有構造器

介面是所有抽象方法的集合,注意,是集合,不是類。當然沒有構造方法一說,更別提什麼構造器了。

4.可使用的修飾符:

(1)抽象方法可以有public、protected和default這些修飾符

抽象類的目的就是被繼承,抽象方法就是為了被重寫,所以肯定不能用private修飾符,肯定是可以用public的。但是protected和default也是可以的。

(2)介面方法預設修飾符是public。你不可以使用其它修飾符。

介面就有且只有一個public修飾。

5.速度方面:

(1)抽象方法比介面速度要快。

(2)介面是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。

6.增加新方法對子類的影響:

(1)如果你往抽象類中新增新的方法,你可以給它提供預設的實現。因此你不需要改變你現在的程式碼。

抽象類可以有一些非抽象方法的存在,這些方法被稱為預設實現。如果新增一個預設實現方法(不能是抽象方法),就不需要在子類中去實現,所以繼承這個抽象類的子類無須改動。

如果你往介面中新增方法,那麼你必須改變實現該介面的類。

(2)介面中只能新增抽象方法,當你添加了抽象方法,實現該介面的類就必須實現這個新新增的方法。

因為,定義中說的很清楚,介面的實現必須實現所有的方法。所有,當然包括新新增的方法。

7.子類能繼承的數量:

抽象類在java語言中所表示的是一種繼承關係,一個子類只能存在一個父類,但是可以存在多個介面。

java在類的繼承上並沒有多繼承。抽象類屬於類,所以可以被繼承。但子類只能繼承一個父類。

java為了實現多繼承,使用了介面。一個類可以實現多個介面。