接口和抽象類的區別

對於面向對象編程來說,抽象是它的一大特徵之一(面向對象的四大特性:封裝、繼承、多態、抽象)。在Java中,可以通過兩種形式來體現OOP的抽象:接口和抽象類。這兩者有太多相似的地方,又有太多不同的地方。今天我們就一起來學習一下Java中的接口和抽象類。

一、抽象類

1.抽象方法和抽象類
抽象方法必須用abstract關鍵字進行修飾。如果一個類含有抽象方法,則稱這個類爲抽象類,抽象類必須在類前用abstract關鍵字修飾。因爲抽象類中含有無具體實現的方法,所以不能用抽象類創建對象。

先了解下抽象方法和抽象類的聲明格式:

/*抽象類*/
public abstract class ClassName {
    //抽象方法
   protected abstract void fun();
    //普通方法
   public void commonFun() {...}
}

從這裏可以看出,抽象類就是爲了繼承而存在的,如果你定義了一個抽象類,卻不去繼承它,那麼等於白白創建了這個抽象類,因爲你不能用它來做任何事情。對於一個父類,如果它的某個方法在父類中實現出來沒有任何意義,必須根據子類的實際需求來進行不同的實現,那麼就可以將這個方法聲明爲abstract方法,此時這個類也就成爲abstract類了。
包含抽象方法的類稱爲抽象類,但並不意味着抽象類中只能有抽象方法,它和普通類一樣,同樣可以擁有成員變量和普通的成員方法。

2.抽象類和普通類的區別:
1). 抽象方法必須爲public或者protected(因爲如果爲private,則不能被子類繼承,子類便無法實現該方法),缺省情況下默認爲public,抽象方法不能有方法體。
2). 抽象類不能用來創建對象。
3). 如果一個類繼承於一個抽象類,則子類必須實現父類的抽象方法。如果子類沒有實現父類的抽象方法,則必須將子類也定義爲爲abstract類。
4). 含有抽象方法的類只能被定義成抽象類。

二、接口

接口,英文稱作interface,接口泛指供別人調用的方法或者函數。從這裏,我們可以體會到Java語言設計者的初衷,它是對行爲的抽象。
接口的定義形式如下:

public interface InterfaceName {
  [public abstract] void OnClickListener()
}

接口中可以含有變量和方法。但是要注意,接口中的變量會被隱式地指定爲public static final變量(並且只能是public static final變量,用private修飾會報編譯錯誤),而方法會被隱式地指定爲public abstract方法且只能是public abstract方法(用其他關鍵字,比如private、protected、static、 final等修飾會報編譯錯誤),並且接口中所有的方法不能有具體的實現,也就是說,接口中的方法必須都是抽象方法。從這裏可以隱約看出接口和抽象類的區別,接口是一種極度抽象的類型,它比抽象類更加“抽象”。

作爲接口就需要被實現 ,使用implements關鍵字,具體格式如下:

public class ClassName implements InterfaceName{
    @Override
    public void OnClickListener() {   
    }
}

允許一個類遵循多個特定的接口。如果一個非抽象類遵循了某個接口,就必須實現該接口中的所有方法。對於遵循某個接口的抽象類,可以不實現該接口中的抽象方法。

public class ClassName implements Interface1,Interface2,[....]{
}

三、抽象類和接口的區別

  1. 抽象類和接口都不能被實例化。如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。
  2. 抽象類可以有默認的方法實現,接口完全是抽象的,接口根本不存在方法的實現。
  3. 抽象類是可以後構造器的,接口是不允許有構造器的。
  4. 抽象方法可以使用public、protected修飾符,接口只能使用public修飾符。
  5. 抽象類裏可以可以定義靜態方法,可以定義普通成員變量,也可以定義靜態常量;接口不能定義靜態方法,不能定義普通成員變量,只能定義靜態常量。
  6. 一個類最多只能有一個直接父類,包括抽象類;但是一個類可以直接實現多個接口。通過實現多個接口可以彌補Java中單繼承的不足。

四、總結

當你關注一個事物的本質的時候,用抽象類;當你關注一個操作的時候,用接口。
抽象類的功能要遠超過接口,但是,定義抽象類的代價高。因爲高級語言來說(從實際設計上來說也是)每個類只能繼承一個類。在這個類中,你必須繼承或編寫出其所有子類的所有共性。雖然接口在功能上會弱化許多,但是它只是針對一個動作的描述。而且你可以在一個類中同時實現多個接口。在設計階段會降低難度的。

如果理解的有誤,還望指正。謝謝!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章