天天看點

Java抽象類與接口的差別

看到題目的時候,你掌握這個知識點了嗎?

Java抽象類與接口的差別

圖檔來源與網絡

常見面試問題如下:

  • 接口和抽象類的差別,什麼時候使用?
  • 抽象類和接口的相同點和不同點?

總之就是經常問到的問題了。官方文檔有句很逗的話,說給面試官聽,估計很有意思。

Java抽象類與接口的差別

Java語言規範

所有的接口都是隐式的抽象聲明。

Abstract class vs Interface

抽象類與接口都是用于功能的抽象。

  • 方法: 接口隻能有抽象方法,抽象類可以有抽象方法和非抽象方法。Java8以後,接口可以直接定義default和static方法了。抽象類可以有protect和private方法。
  • 成員變量:接口中的成員變量預設是static和final的,抽象類可以像正常的對象一樣定義各種成員變量。可以是非static和final的
  • 實作:接口不能實作其他的接口,隻能繼承一個其它的接口。抽象類可以實作多個接口。
  • 構造器:抽象類可以有構造器,接口不能有構造器。
  • main方法: 抽象類可以有main方法,并且我們可以運作它。接口不能有main方法。
  • 速度:抽象類速度更快一些,接口需要時間尋找類中的實作方法。

使用場景

Java8以後可以直接在接口中定義default方法和static方法,如此接口與抽象類之間的差異就小了一些。

抽象類使用場景

  • 當你需要定義非靜态和和或final類型的成員變量時,想要修改類中某些成員的狀态的時候。考慮使用抽象類。
  • 如果基本功能在不斷改變,那麼就需要使用抽象類。如果不斷改變基本功能并且使用接口,那麼就需要改變所有實作了該接口的類。
  • 有時候一個類中全部都是靜态方法,無需執行個體化的類可以考慮使用抽象類

接口使用場景

  • 所有的定義的方法必須要實作的時候,完全的抽象考慮使用接口
  • 一個類需要實作多于一個的接口。這個也叫做多繼承

最後

解釋一個常見的知識點

參考