1. 程式人生 > >一、面試準備--介面和抽象類有什麼區別

一、面試準備--介面和抽象類有什麼區別

對於面向物件程式設計來說,抽象是它的一大特徵之一。在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定義的方法不可以被子類的方法重寫