接口和抽象類的區(qū)別

對于面向?qū)ο缶幊虂碚f,抽象是它的一大特征之一(面向?qū)ο蟮乃拇筇匦裕悍庋b、繼承、多態(tài)、抽象)。在Java中,可以通過兩種形式來體現(xiàn)OOP的抽象:接口和抽象類。這兩者有太多相似的地方,又有太多不同的地方。今天我們就一起來學(xué)習(xí)一下Java中的接口和抽象類。

一、抽象類

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

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

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

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

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

二、接口

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

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

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

作為接口就需要被實現(xiàn) ,使用implements關(guān)鍵字,具體格式如下:

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

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

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

三、抽象類和接口的區(qū)別

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

四、總結(jié)

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容