抽象类(abstract class)和接口(Interface)的区别
抽象類(abstract class)和接口(Interface)的區別
前言
- 抽象類(abstract class)和接口(Interface)是Java語言中對于抽象類定義進行支持的兩種機制,賦予了Java強大的面向對象能力。
- 二者具有很大的相似性,甚至可以相互替換,因此很多開發者在進行抽象類定義時對于abstractclass和Interface的選擇顯得比較隨意。其實,兩者之間還是有很大的區別的。
- 本文將對它們之間的區別進行剖析,并提供一個在二者之間進行選擇的依據。
抽象類是什么?
本文中的抽象類表示的是一個抽象體,并非直接從abstract class翻譯而來,而abstract class僅僅是Java語言中用于定義抽象類的一種方法,請讀者注意區分)
-
在面向對象的概念中,所有的對象都是通過類來描繪的,但是并不是所有的類都是用來描繪對象的,如果一個類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類就是抽象類。
-
抽象類的定義
是對一系列看上去不同,但是本質上相同的具體概念的抽象,往往用來表征我們在對問題進行分析、設計中得出的抽象概念- 比如:如果我們進行一個圖形編輯軟件的開發,就會發現問題領域存在著圓、三角形這樣一些具體概念,它們是不同的,但是它們本質上又都屬于這樣一個概念:形狀,形狀這個概念在問題領域是不存在的,所以形狀就是一個圓形、三角形的抽象類。
- 正是因為抽象的概念在問題領域沒有對應的具體概念,所以用以表征抽象概念的抽象類是不能實例化的。
為什么要有抽象類?
- 用于類型隱藏
在面向對象領域,抽象類主要用來進行類型隱藏。我們可以構造出一個固定的一組行為的抽象描述,但是這組行為卻能夠有任意個可能的具體實現方式。這個抽象描述就是抽象類。 - 用于拓展對象的行為功能
這一組任意個可能的具體實現則表現為所有可能的派生類(子類),模塊可以操作一個抽象體。由于模塊依賴于一個固定的抽象體,因此它可以是不允許修改的;同時,通過從這個抽象體派生,也可擴展此模塊的行為功能。
如何進行抽象類的定義?
抽象類(abstract class)和接口(Interface)在Java語言中都是用來進行抽象類定義的兩種主要方法
抽象類(abstract class)
-
定義:包含抽象方法的的類是abstract class
用abstract關鍵字修飾
-
作用:abstractclass是為了把相同的東西提取出來,即重用
-
使用abstractclass語法規定
| 抽象類定義用abstract關鍵字修飾 | 要通過子類進行實例化 |
| 抽象類是不能被實例化的 | 要通過子類進行實例化 |
| 子類必須重寫父類的所有抽象方法 | 抽象方法:聲明但卻未被實現的方法,用abstract關鍵字修飾 |
| 含有抽象方法的類一定是抽象類,但是抽象類不一定含有抽象方法 | 無 |
| 抽象類是用來被它的子類繼承的 | 關鍵字extends |
| 抽象類是在功能上的一個規定 | 無 |
Interface
-
定義:比abstract class更加抽象,是一種特殊的abstract class
用Interface關鍵字修飾
-
作用:Interface是為了把程序模塊進行固化的契約,是為了降低偶合
- 使用Interface的語法規定
| 接口定義用Interface關鍵字修飾 | ? |
| 接口中的所有方法都是抽象的 | 可以用abstract修飾,也可以省略 |
| 接口中的方法必須是用public修飾,或不寫 | 但是不能被其他修飾符修飾 |
| 接口中的屬性必須是全局常量 | publicstaticfinal修飾 |
| 抽象類是用來被它的子類實現的 | 關鍵字Implements |
| 抽象類是在結構上的一個規定 | 無 |
| 接口不能被實例化 | 無 |
| 子類實現接口時需要實現接口中的所有方法 | 若有一個未不實現,該子類就是抽象類abstractclass |
實例
下面以定義一個名為Demo的抽象類為例來說明這種不同。
- 使用abstract class的方式定義Demo抽象類:
-
abstract classDemo{
-
abstract void method1();
-
abstract avoid method2();}
- 使用interface的方式定義Demo抽象類:
-
interface Demo{
-
void method1();
-
void method2();}
二者的相同點
都不能被實例化
二者的區別
| 定義 | abstract class關鍵字 | Interface關鍵字 |
| 繼承 | 抽象類可以繼承一個類和實現多個接口;子類只可以繼承一個抽象類 | 接口只可以繼承接口(一個或多個);子類可以實現多個接口 |
| 訪問修飾符 | 抽象方法可以有public、protected和default這些修飾符 | 接口方法默認修飾符是public。你不可以使用其它修飾符 |
| 方法實現 | 可定義構造方法,可以有抽象方法和具體方法 | 接口完全是抽象的,沒構造方法,且方法都是抽象的,不存在方法的實現 |
| 實現方式 | 子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有聲明的方法的實現 | 子類使用關鍵字implements來實現接口。它需要提供接口中所有聲明的方法的實現 |
| 作用 | 了把相同的東西提取出來,即重用 | 為了把程序模塊進行固化的契約,是為了降低偶合 |
總結
本文對抽象類(abstract class)和接口(Interface)進行了簡單的總結,有興趣可以繼續關注Carson_Ho的安卓開發筆記,不定期分享關于安卓開發的干貨
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的抽象类(abstract class)和接口(Interface)的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 30年货币翻了300倍!如何能跑赢印钞机
- 下一篇: 如何在工作中快速成长?致工程师的10个简