定義
- 抽象類:含有抽象方法(abstract修飾的方法)的類,用來捕捉子類的通用特性,不能被實例化,只能被用作子類的超類。抽象類是用來創建繼承層級里子類的模板。
- 接口:是抽象方法的集合。
對比
抽象類 | 接口 | |
---|---|---|
默認方法實現 | 可以有默認方法實現 | 接口完全抽象,不存在方法實現 |
實現 | extends關鍵字。 如果子類不是抽象類,需要提供抽象類中所有聲明的抽象方法的實現 |
implements關鍵字。 提供接口中所有聲明方法實現 |
構造函數 | 可以有構造函數,用於子類訪問父類數據的初始化 | 不能有構造函數 |
與正常類區別 | 除了不能實例化外無區別 | 接口是完全不同的類型 |
訪問修飾符 | 抽象方法可以有public、protected和default | 默認public,不能用其他 |
main方法 | 可以有且可運行 | 不能有,無法運行 |
多繼承 | 可繼承一個類和實現多個接口 | 一個接口可以繼承多個其他接口 |
添加新方法 | 抽象類中添加新方法,可提供默認實現,不需改變現有代碼 | 改變實現該接口的類 |
速度 | 比接口速度快 |
使用場景
- 如果有一些方法且其中有一些有默認實現,使用抽象類
- 如果想實現多繼承必須使用接口,因為java不支持多繼承,子類不能繼承多個父類,但可以實現多個接口
- 如果基本功能在不斷改變,需使用抽象類
- 抽象繼承表示 is a 的關系,接口實現表示 has a 的關系
- 一個類不能extends多個類,但可以繼承implements多個接口
- 一個接口不能implements任何接口,但可以extends多個接口
- 抽象類implements接口,可以不用重寫接口的方法,可以全部不重寫或只重寫一部分方法
- 普通類implements接口,必須重寫接口的所有方法
- 接口B extends 接口A,實現類C implements 接口B時,類C必須實現接口A和接口B中的所有方法