轉自:https://blog.csdn.net/mandypan/article/details/52138062html
在Java語言中,abstract class和interface是支持抽象類定義的兩種機制。函數
不能建立abstract類的實例,然而能夠建立一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。post
不能有抽象構造函數或抽象靜態方法。.net
Abstract 類的子類爲它們父類中的全部抽象方法提供實現,不然它們也是抽象類。htm
接口(interface)是抽象類的變體。對象
在接口中,全部方法都是抽象,公開的。多繼承性可經過實現這樣的接口而得到。blog
接口中的全部方法都沒有一個有程序體。接口只能夠定義staticfinal成員變量。繼承
接口的實現與子類類似,除了該實現類不能從接口定義中繼承行爲。接口
當類實現特殊接口時,它定義(即將程序體給予)全部這種接口的方法。而後,它能夠在實現了該接口的類的任何對象上調用接口的方法。get
因爲有抽象類,它容許使用接口名做爲引用變量的類型。一般的動態聯編將生效。
引用能夠轉換到接口類型或從接口類型轉換,instanceof運算符能夠用來決定某對象的類是否實現了接口。
接口能夠繼承接口。抽象類能夠實現(implements)接口,抽象類是能夠繼承實體類,但前提是實體類必須有明確的構造函數。接口更關注「能實現什麼功能」,而無論「怎麼實現的」。
1.相同點
A. 二者都是抽象類,都不能實例化。
B. interface實現類及abstrctclass的子類都必需要實現已經聲明的抽象方法。
2. 不一樣點
A. interface須要實現,要用implements,而abstract class須要繼承,要用extends。
B. 一個類能夠實現多個interface,但一個類只能繼承一個abstract class。
C. interface強調特定功能的實現,而abstractclass強調所屬關係。
D. 儘管interface實現類及abstrct class的子類都必需要實現相應的抽象方法,但實現的形式不一樣。interface中的每個方法都是抽象方法,都只是聲明的(declaration,沒有方法體),實現類必需要實現。而abstractclass的子類能夠有選擇地實現。
這個選擇有兩點含義:
一是Abastract class中並不是全部的方法都是抽象的,只有那些冠有abstract的方法纔是抽象的,子類必須實現。那些沒有abstract的方法,在Abstrct class中必須定義方法體。
二是abstract class的子類在繼承它時,對非抽象方法既能夠直接繼承,也能夠覆蓋;而對抽象方法,能夠選擇實現,也能夠經過再次聲明其方法爲抽象的方式,無需實現,留給其子類來實現,但此類必須也聲明爲抽象類。既是抽象類,固然也不能實例化。
E. abstract class是interface與Class的中介。
interface是徹底抽象的,只能聲明方法,並且只能聲明pulic的方法,不能聲明private及protected的方法,不能定義方法體,也不能聲明實例變量。然而,interface卻能夠聲明常量變量,而且在JDK中不難找出這種例子。但將常量變量放在interface中違背了其做爲接口的做用而存在的宗旨,也混淆了interface與類的不一樣價值。若是的確須要,能夠將其放在相應的abstractclass或Class中。
abstract class在interface及Class中起到了承上啓下的做用。一方面,abstract class是抽象的,能夠聲明抽象方法,以規範子類必須實現的功能;另外一方面,它又能夠定義缺省的方法體,供子類直接使用或覆蓋。另外,它還能夠定義本身的實例變量,以供子類經過繼承來使用。
3. interface的應用場合 A. 類與類以前須要特定的接口進行協調,而不在意其如何實現。 B. 做爲可以實現特定功能的標識存在,也能夠是什麼接口方法都沒有的純粹標識。 C. 須要將一組類視爲單一的