JAVA面試題:介面和抽象類的區別和聯絡
一、介面的概念:
介面(Interface),在JAVA程式語言中是一個抽象型別,是抽象方法的集合。介面通常以interface來宣告。一個類通過繼承介面的方式,從而來繼承介面的抽象方法。
如果一個類只由抽象方法和全域性常量組成,那麼這種情況下不會將其定義為一個抽象類。只會定義為一個介面,所以介面嚴格的來講屬於一個特殊的類,而這個類裡面只有抽象方法和全域性常量,就連構造方法也沒有。
參考:
二、介面和抽象類的區別
1.共性:
不斷的進行抽取,抽取出抽象的,沒有具體實現的方法,都不能例項化(不能建立物件)
2.區別
1): 與類的關係
類與介面是實現關係,而且是多實現,一個類可以實現多個介面,類與抽象類是繼承關係,Java中的繼承是單一繼承,多層繼承,一個類只能繼承一個父類,但是可以有爺爺類
2): 成員
a.成員變數
抽象類可以有成員變數,也可以有常量
介面只能有常量,預設修飾符public static final
b.成員方法
抽象類可以有抽象方法,也可以有非抽象方法
介面只能有抽象方法,預設修飾符 public abstract
c.構造方法
抽象類有構造方法,為子類提供
介面沒有構造方法
設計理念:
介面:強調的是擴充套件性,
抽象:強調的是 共性功能
對比 | 抽象類 | 介面 |
預設的方法實現 | 它可以有預設的方法實現 | 介面完全是抽象的。它根本不存在方法的實現 |
實現 | 子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有宣告的方法的實現。 | 子類使用關鍵字implements來實現介面。它需要提供介面中所有宣告的方法的實現 |
構造器 | 抽象類可以有構造器 | 介面不能有構造器 |
與正常Java類的區別 | 除了你不能例項化抽象類之外,它和普通Java類沒有任何區別 | 介面是完全不同的型別 |
訪問修飾符 | 抽象方法可以有public、protected和default這些修飾符 | 介面方法預設修飾符是public。你不可以使用其它修飾符。 |
main方法 | 抽象方法可以有main方法並且我們可以執行它 | 介面沒有main方法,因此我們不能執行它。 |
多繼承 | 抽象方法可以繼承一個類和實現多個介面 | 介面只可以繼承一個或多個其它介面 |
速度 | 它比介面速度要快 | 介面是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。 |
新增新方法 | 如果你往抽象類中新增新的方法,你可以給它提供預設的實現。因此你不需要改變你現在的程式碼。 | 如果你往介面中新增方法,那麼你必須改變實現該介面的類。 |
參考:
三、什麼時候使用抽象類和介面
- 如果你擁有一些方法並且想讓它們中的一些有預設實現,那麼使用抽象類吧。
- 如果你想實現多重繼承,那麼你必須使用介面。由於Java不支援多繼承,子類不能夠繼承多個類,但可以實現多個介面。因此你就可以使用介面來解決它。
- 如果基本功能在不斷改變,那麼就需要使用抽象類。如果不斷改變基本功能並且使用介面,那麼就需要改變所有實現了該介面的類。