類與接口

說明

文本轉載自:Java基礎知識面試題(2020最新版) 有少量修改

抽象類和接口的對比

抽象類是用來捕捉子類的通用特性的。接口是抽象方法的集合。

從設計層面來說,抽象類是對類的抽象,是一種模板設計,接口是行爲的抽象,是一種行爲的規範。

相同點

  • 接口和抽象類都不能實例化
  • 都包含抽象方法,其子類都必須覆寫這些抽象方法
  • 都位於繼承的頂端,用於被其他實現或繼承

不同點

參數 抽象類 接口
聲明 抽象類使用abstract關鍵字聲明 接口使用interface關鍵字聲明
實現 子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實現 子類使用implements關鍵字來實現接口。它需要提供接口中所有聲明的方法的實現
構造器 抽象類可以有構造器 接口不能有構造器
訪問修飾符 抽象類中的方法可以是任意訪問修飾符 接口方法默認修飾符是public。並且不允許定義爲 private 或者 protected
多繼承 一個類最多隻能繼承一個抽象類 一個類可以實現多個接口
字段聲明 抽象類的字段聲明可以是任意的 接口的字段默認都是 static 和 final 的

備註Java8中接口中引入默認方法和靜態方法,以此來減少抽象類和接口之間的差異。

現在,我們可以爲接口提供默認實現的方法了,並且不用強制子類來實現它。

接口和抽象類各有優缺點,在接口和抽象類的選擇上,必須遵守這樣一個原則:

  • 行爲模型應該總是通過接口而不是抽象類定義,所以通常是優先選用接口,儘量少用抽象類。
  • 選擇抽象類的時候通常是如下情況:需要定義子類的行爲,又要爲子類提供通用的功能。

普通類和抽象類有哪些區別?

  • 普通類不能包含抽象方法,抽象類可以包含抽象方法。
  • 抽象類不能直接實例化,普通類可以直接實例化。

抽象類能使用 final 修飾嗎?

不能,定義抽象類就是讓其他類繼承的,如果定義爲 final 該類就不能被繼承,這樣彼此就會產生矛盾,所以 final 不能修飾抽象類

創建一個對象用什麼關鍵字?對象實例與對象引用有何不同?

new關鍵字,new創建對象實例(對象實例在堆內存中),對象引用指向對象實例(對象引用存放在棧內存中)。一個對象引用可以指向0個或1個對象(一根繩子可以不繫氣球,也可以系一個氣球);一個對象可以有n個引用指向它(可以用n條繩子繫住一個氣球)

是否瞭解JDK8裏面接口新特性

  • interface中可以有static⽅法,但必須有⽅法實現體,該⽅法只屬於該接⼝,接⼝名直接調⽤ 該⽅法
  • 接⼝中新增default關鍵字修飾的⽅法,default⽅法只能定義在接⼝中,可以在⼦類或⼦接⼝ 中被重寫default定義的⽅法必須有⽅法體
  • ⽗接⼝的default⽅法如果在⼦接⼝或⼦類被重寫,那麼⼦接⼝實現對象、⼦類對象,調⽤該 ⽅法,以重寫爲準
  • 本類、接⼝如果沒有重寫⽗類(即接⼝)的default⽅法,則在調⽤default⽅法時,使⽤⽗類(接口) 定義的default⽅法邏輯

接口是否可以繼承接口?接口是否支持多繼承?類是否支持多繼承?

⼀個類只能繼承⼀個類,但是能實現多個接⼝,接⼝能繼承另⼀個接⼝,接⼝的繼承使⽤extends關鍵字,和類繼承⼀樣

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章