謝邀,鄭重聲明一下。請大家仔細閱讀,你要是從頭到尾讀完還沒明白接口和抽象類的區別。那么你還是別學編程了。?
這是初學者經常會遇到的問題,看到這個問題,自己想起來以前痛苦的學習過程。簡單的回答一下。接口和抽象類之間有沒有區別?可以肯定的回答:有區別。那既然有區別,我們不妨帶著疑問去探索一下,語言設計者們在設計接口和抽象類時為什么要設計出區別,他們的目的何在。編程語言的設計其實也是一門哲學。
首先接口和抽象類的設計目的就是不一樣的。接口是對動作的抽象,而抽象類是對根源的抽象。對于抽象類,比如男人,女人這兩個類,那我們可以為這兩個類設計一個更高級別的抽象類--人。對于接口,我們可以坐著吃飯,可以站著吃飯,可以用筷子吃飯,可以用叉子吃飯,甚至可以學三哥一樣用手抓著吃飯,那么可以把這些吃飯的動作抽象成一個接口--吃飯。所以在高級語言中(如Java,C#),一個類只能繼承一個抽象類(因為你不可能同時是生物又是非生物)。但是一個類可以同時實現多個接口,比如開車接口,滑冰接口,啪啪啪接口,踢足球接口,游泳接口。
?總結幾句話來說:
1、抽象類和接口都不能被直接實例化,如果二者要實例化,就涉及到多態,不懂多態的參見我的回答<a href=\"https://www.zhihu.com/question/30082151/answer/120520568\" class=\"internal\">JAVA的多態用幾句話能直觀的解釋一下嗎? - 知乎。如果抽象類要實例化,那么抽象類定義的變量必須指向一個子類對象,這個子類繼承了這個抽象類并實現了這個抽象類的所有抽象方法。如果接口要實例化,那么這個接口定義的變量要指向一個子類對象,這個子類必須實現了這個接口所有的方法。
2、抽象類要被子類繼承,接口要被子類實現。
3、接口里面只能對方法進行聲明,抽象類既可以對方法進行聲明也可以對方法進行實現。
4、抽象類里面的抽象方法必須全部被子類實現,如果子類不能全部實現,那么子類必須也是抽象類。接口里面的方法也必須全部被子類實現,如果子類不能實現那么子類必須是抽象類
5、接口里面的方法只能聲明,不能有具體的實現。這說明接口是設計的結果,抽象類是重構的結果。</p>
6、抽象類里面可以沒有抽象方法
7、如果一個類里面有抽象方法,那么這個類一定是抽象類。
8、抽象類中的方法都要被實現,所以抽象方法不能是靜態的static,也不能是私有的private。
9、接口(類)可以繼承接口,甚至可以繼承多個接口。但是類只能繼承一個類。
10、抽象級別(從高到低):接口>抽象類>實現類。
11、抽象類主要是用來抽象類別,接口主要是用來抽象方法功能。當你關注事物的本質的時候,請用抽象類;當你關注一種操作的時候,用接口。
12、抽象類的功能應該要遠多于接口,但是定義抽象類的代價較高。因為高級語言一個類只能繼承一個父類,即你在設計這個類的時候必須要抽象出所有這個類的子類所具有的共同屬性和方法;但是類(接口)卻可以繼承多個接口,因此每個接口你只需要將特定的動作方法抽象到這個接口即可。也就是說,接口的設計具有更大的可擴展性,而抽象類的設計必須十分謹慎。
文章來源:https://www.zhihu.com/people/leaping123/activities