您現在的位置是:首頁 > 垂釣

Java抽象類及其介面,它們有什麼不同嗎?

  • 由 王萌曼漫 發表于 垂釣
  • 2021-07-09
簡介如果一個子類沒有實現父類的抽象方法,則該子類也必須被宣告為抽象類

插口分幾種

Java抽象類及其介面,它們有什麼不同嗎?

結構

如果自下而上在類的繼承層次結構中上移,位於上層的類更具有通用性,甚至可能更加抽象。試想一下,一名僱員Employee屬於人類Person,一名學生Student也屬於人類Person,這三個類之間的關係層次圖如下圖所示。

Java抽象類及其介面,它們有什麼不同嗎?

每個人都有一些諸如姓名這樣的共同屬性,學生與僱員都有姓名屬性,因為父類的屬性將會繼承給子類,所以這樣的共同屬性和共同方法可以交給父類來表達,這樣子類只要專注子類自己特有的屬性和方法。

提升到父類中表達的屬性和方法中,特別是成員方法,有時要實現具體的表達往往並不能做到。例如,封裝動物類Animal,在該類中封裝所有動物都有的行為進食eat,如何將所有動物的進食行為都能描述出來,顯然這是不可能的,所以像eat()這樣的成員方法無法實現具體描述,那麼,可以考慮將其設定為抽象的。

Java中的抽象方法和抽象類使用關鍵字abstract進行描述。抽象方法沒有方法體,而包含有抽象方法的類稱為抽象類(抽象類也可以沒有抽象方法)。

說明:

抽象類中的抽象方法等待子類去實現,即抽象類必須被繼承,抽象方法必須被重寫。因此,抽象類和抽象方法不能用 final 修飾。

如果一個子類沒有實現父類的抽象方法,則該子類也必須被宣告為抽象類。

抽象類不能被例項化。但可以宣告一個抽象類的變數,指向其非抽象的子類的物件。

類的構造方法和靜態方法不能被宣告為抽象的。

抽象類中可以包含成員變數、構造方法、抽象方法和具體方法。

Java抽象類及其介面,它們有什麼不同嗎?

在Java程式設計語言中,介面不是類,而是對類的一組需求描述,這些類要遵從介面描述的統一格式進行定義。

介面是一組常量和抽象方法的集合,該集合代表了一組行為功能的標準化宣告。

介面有點象一個規範、一個協議,是一個抽象的概念。

如果一個類宣告實現某一介面,則它必須實現該介面中所有的抽象方法。

一個類可以實現多個介面,這彌補了Java 單繼承的不足。

介面提供了方法宣告與方法實現相分離的機制。介面中宣告的抽象方法約定了多個類共用的方法宣告,每個實現介面的類可以根據自身的實際情況,給出抽象方法的具體實現。

介面的宣告

使用 interface 關鍵字宣告介面,具體的語法形式如下:

[public] interface <介面名> [extends <父介面名>] {

[public][static][final]<型別> <常量名> = <常量值>;

[public][abstract] <返回值型別> <方法名> ( <引數表> );

}

要注意的是:

介面的訪問許可權修飾符只有兩種情況:public 或預設。

一個介面可以繼承其他介面。子介面繼承父介面中所有的常量和方法。

介面中的常量全部預設為 public、static 和 final ,宣告時必須初始化。

介面中的方法全部預設為 public 和 abstract,介面中不能有非抽象方法。

介面沒有構造方法,不能被例項化。

介面的實現

類使用 implements 關鍵字實現介面,語法形式如下:

[修飾符] class <類名> [extends <父類名>] [implements <介面名1>,<介面名2>,…]

要注意的是:

一個類可以實現多個介面,介面名之間用逗號分隔。

如果一個類宣告實現某個介面,則它必須實現該介面中所有的抽象方法,且方法宣告為 public 。否則這個類必須被定義為抽象類。

介面與抽象類的不同

抽象類宣告多個子類之間共同使用的方法;介面宣告多個無關類之間共同使用的方法。

一個類只能有一個直接父類,這個父類可能是抽象類;但一個類可以實現多個介面,這是介面的優勢所在。

抽象類中可以包含成員變數;介面中只能包含常量。

抽象類可以有構造方法;介面沒有構造方法。

Top