一、面試準備--介面和抽象類有什麼區別
對於面向物件程式設計來說,抽象是它的一大特徵之一。在Java中,可以通過兩種形式來體現OOP的抽象:介面和抽象類。
首先,看一下兩者的定義:
抽象類
抽象類是用來捕捉子類的通用特性的 。它不能被例項化,只能被用作子類的超類。抽象類是被用來建立繼承層級裡子類的模板。
[public] abstract class ClassName {
abstract void fun();
}
1)抽象方法必須為public或者protected(因為如果為private,則不能被子類繼承,子類便無法實現該方法),預設情況下預設為public。
2)抽象類不能用來建立物件;
3)如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義為為abstract類。
介面
介面是抽象方法的集合。如果一個類實現了某個介面,那麼它就繼承了這個介面的抽象方法。這就像契約模式,如果實現了這個介面,那麼就必須確保使用這些方法。介面只是一種形式,介面自身不能做任何事情。
[public] interface InterfaceName {
abstract void fun();
}
介面中可以含有變數和方法。但是,介面中的變數會被隱式地指定為public static final變數(並且只能是public static final常量,沒有變數屬性,用private修飾會報編譯錯誤),而方法會被隱式地指定為public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且介面中的方法必須都是抽象方法,即所有方法都必須只有方法名,沒有方法體。
抽象方法
抽象方法是一種特殊的方法:它只有宣告,而沒有具體的實現,通俗的說,就是隻有方法名,而沒有方法體。抽象方法必須用abstract關鍵字進行修飾。如果一個類含有抽象方法,則稱這個類為抽象類,抽象類必須在類前用abstract關鍵字修飾。
--》有抽象方法的一定是抽象類,但抽象類不一定有抽象方法;抽象類中可以有非抽象方法。
抽象類和介面的對比
引數 | 抽象類 | 介面 |
預設的方法實現 | 它可以有預設的方法實現 | 介面完全是抽象的。它根本不存在方法的實現 |
實現 | 子類使用extends關鍵字來繼承抽象類。如果子類不是抽象類的話,它需要提供抽象類中所有宣告的方法的實現。 | 子類使用關鍵字implements來實現介面。它需要提供介面中所有宣告的方法的實現 |
構造器 | 抽象類可以有構造器 | 介面不能有構造器 |
例項化 | 不能例項化 | 不能例項化 |
訪問修飾符 |
抽象方法可以有public、protected和default這些修飾符(不能private,因為抽象方法要被子類覆寫.如果用 private宣告的話,則子類是無法覆寫的); 但是,成員方法(非抽象方法)和成員屬性可以是private的 |
介面方法預設修飾符是public ; 屬性的預設修飾符是public static final |
main方法 | 抽象方法可以有main方法並且我們可以執行它 | 介面沒有main方法,因此我們不能執行它。 |
多繼承 |
抽象類可以繼承一個類; 一個類可以實現多個介面 |
一個介面繼承多個介面 |
速度 | 它比介面速度要快 | 介面是稍微有點慢的,因為它需要時間去尋找在類中實現的方法。 |
新增新方法 | 如果你往抽象類中新增新的方法,你可以給它提供預設的實現。因此你不需要改變你現在的程式碼。 | 如果你往介面中新增方法,那麼你必須改變實現該介面的類。 |
靜態屬性 | 抽象類可以有靜態程式碼塊和靜態方法 | 介面中不能含有靜態程式碼塊以及靜態方法。 |
抽象類不能用final宣告,因為抽象類必須有子類,而final定義的類不能有子類,補充final定義的方法不可以被子類的方法重寫