c 抽象類與介面的區別

2021-09-11 01:35:26 字數 1539 閱讀 4209

前面幾篇部落格介紹了抽象類與介面,提到其中乙個,很容易想到另外乙個,包括搜尋時自動聯想的內容也是兩者的區別,因為抽象類和介面在使用方法上很類似。

如果想簡單看下兩者區別的,這裡我以 excel **形式做了總結。

如果想深入了解兩者區別的,可以看下方內容。

為方便理解,這裡我再簡述一下抽象類與介面。

抽象類:

抽象類是特殊的類,只是不能被例項化;除此以外,具有類的其他特性;

重要的是抽象類可以包括抽象方法,這是普通類所不能的。

抽象方法只能宣告於抽象類中,且不包含任何實現,派生類必須覆蓋它們。

另外,抽象類可以派生自乙個抽象類,可以覆蓋基類的抽象方法也可以不覆蓋,如果不覆蓋,則其派生類必須覆蓋它們。

介面:介面除了可以包含方法之外,還可以包含屬性、索引器、事件,而且這些成員都被定義為公有的。除此之外,不能包含任何其他的成員,例如:常量、域、建構函式、析構函式、靜態成員。

相同點:

1)都可以被繼承。

2)不能被例項化。

3)自身不提供實現**。

4)派生類必須實現未實現的方法。

不同點:

1)抽象基類可以定義字段、屬性、方法實現。介面只能定義屬性、索引器、事件、和方法宣告,不能包含字段。

2)介面可以被多重實現,抽象類只能被單一繼承。

3)乙個類一次可以實現若干個介面,但是只能擴充套件乙個父類。

4)抽象類實現的具體方法預設為虛的,但實現介面的類中的介面方法預設為非虛的,不過你也可以宣告為虛的。

5)抽象類實現了 oop 中的乙個原則,把可變的與不可變的分離。抽象類和介面就是定義為不可變的,而把可變的交給子類去實現。

6)好的介面定義應該是具有專一功能性的,而不是多功能的,否則造成介面汙染。如果乙個類只是實現了這個介面的中乙個功能,而不得不去實現介面中的其它方法,就叫介面汙染。

下面我單獨將 相同點 裡的第三條(自身不提供實現**)抽出來。因為這點對抽象類與介面來說並不完全相同。

//抽象類的定義

public

abstract

class

test

public

abstract

int value

}

//介面的定義

public

inte***ce

itest

}

通過上面兩段**,我們會發現以下幾點差異。

1)抽象類的成員定義是帶有可訪問性關鍵字的(例如:public),而介面是不帶可訪問性關鍵字的,因為介面中所宣告的成員都是公共的(隱式public),所以沒有必要新增訪問修飾符。

2)抽象類除了包含抽象成員外,還可以包含非抽象成員,也包括建構函式、而介面不能包含具備實現**的成員,也不能包含建構函式。因為介面是另一種型別,不是類,而抽象類是類的一種。

java抽象類與介面的區別抽象類與介面的特性是什麼

介面和抽象類的概念不一樣。介面是對動作的抽象,抽象類是對根源的抽象。抽象類表示的是個物件,什麼物件。介面表示的是物件的功能,能做什麼。舉個例子 男人 物件 和女人 物件 這兩個類 物件 他們可以抽象為人。公貓和母貓可以抽象為貓。人可以吃飯,可以睡覺,貓呢也可以吃飯和睡覺,那麼這個 吃飯 睡覺 就是某...

抽象類與介面的區別

c 中可以多繼承介面,卻只能繼承自乙個抽象類 抽象類中的方法可以包含一些實現,但介面卻只能定義方法的一種規範,不能包含實現 繼承類必須實現藉口中所有的方法,而不一定要實現抽象類中的所有方法 抽象類可以繼承自抽象類 但介面不能繼承自介面 派生類必須實現未實現的方法,抽象類是抽象方法,介面則是所有成員 ...

抽象類與介面的區別

c 中可以多繼承介面,卻只能繼承自乙個抽象類 抽象類中的方法可以包含一些實現,但介面卻只能定義方法的一種規範,不能包含實現 繼承類必須實現藉口中所有的方法,而不一定要實現抽象類中的所有方法 抽象類可以繼承自抽象類 但介面不能繼承自介面 派生類必須實現未實現的方法,抽象類是抽象方法,介面則是所有成員 ...