abstract關(guān)鍵字修飾的類就是抽象類(abstract class),抽象類是聲明方法的存在而不去實(shí)現(xiàn)它的類剪决,它用于要?jiǎng)?chuàng)建一個(gè)體現(xiàn)某些基本行為的類拗胜,并為該類聲明方法蔗候,但不能在該類中實(shí)現(xiàn)該類的情況。抽象類不一定要有抽象方法埂软,但是有抽象方法的類一定是抽象類锈遥,抽象類可以有構(gòu)造方法,但是不能夠使用new關(guān)鍵詞實(shí)例化對(duì)象勘畔。
Java接口是一系列方法的聲明所灸,是一些方法特征的集合,一個(gè)接口只有方法的特征沒有方法的實(shí)現(xiàn)炫七,因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn)爬立,而這些實(shí)現(xiàn)可以具有不同的行為
相同點(diǎn):
- 接口和抽象類的繼承都使用的關(guān)鍵字是extends。
- 不能實(shí)例化,都有抽象方法
- 包含未實(shí)現(xiàn)的方法聲明
- 派生類必須實(shí)現(xiàn)未實(shí)現(xiàn)的方法万哪,抽象類是抽象方法侠驯,接口則是所有成員(不僅是方法包括其他成員)
不同點(diǎn):
- abstract class在Java語言中表示的是一種繼承關(guān)系,一個(gè)類只能使用一次繼承關(guān)系奕巍。但是吟策,一個(gè)類卻可以實(shí)現(xiàn)多個(gè)interface。 繼承抽象類使用的是extends關(guān)鍵字的止,實(shí)現(xiàn)接口使用的是implements關(guān)鍵字踊挠,繼承寫在前面,實(shí)現(xiàn)接口寫在后面冲杀。如果實(shí)現(xiàn)多個(gè)接口效床,中間用逗號(hào)分隔。
- 在abstract class中可以有自己的數(shù)據(jù)成員权谁,也可以有非abstract的成員方法剩檀,而在interface中,只能夠有靜態(tài)的不能被修改的數(shù)據(jù)成員(也就是必須是static final的旺芽,不過在 interface中一般不定義數(shù)據(jù)成員)沪猴,所有的成員方法都是abstract的辐啄。
- abstract class和interface所反映出的設(shè)計(jì)理念不同。其實(shí)abstract class表示的是"is-a"關(guān)系运嗜,interface表示的是"like-a"關(guān)系壶辜。
- 實(shí)現(xiàn)接口的類必須實(shí)現(xiàn)其中的所有方法,繼承自抽象類的子類實(shí)現(xiàn)所有的抽象方法担租。抽象類中可以有非抽象方法砸民。接口中則不能有實(shí)現(xiàn)方法。
- 接口中定義的變量默認(rèn)是public static final 型奋救,且必須給其初值岭参,所以實(shí)現(xiàn)類中不能重新定義,也不能改變其值尝艘。
- 抽象類中的變量默認(rèn)具有 friendly權(quán)限演侯,其值可以在子類中重新定義,也可以重新賦值背亥。
- 接口中的方法默認(rèn)都是 public abstract 類型的秒际。