interface 與abstract class(介面 與 抽象類)的特點以及區別,以及應用場景
一、抽象類(abstract)
1、抽象類不能被例項化,如果例項化就會報錯,編譯無法通過。只有抽象類的非抽象子類可以建立物件。
2、抽象類中不一定含有抽象方法,但是有抽象方法的類一定是抽象類。
3、抽象類中的抽象方法只能宣告,不包含方法體,就是不會給出方法的具體實現。
4、構造方法、類方法(用static修飾的方法)不能宣告為抽象方法。
5、抽象類的子類必須給出抽象類中抽象方法的具體實現,除非子類也是抽象類。
二、介面(interface)
1、介面可以多繼承
2、介面中的方法必須是public abstract,即便不寫預設也是。
3、接口裡面不包含方法的具體實現,即介面中的所有方法都必須是抽象方法。
4、類繼承介面必須實現接口裡面宣告的全部方法,除非該類是抽象類。
5、介面不可以被例項化,但可以被實現類建立。
三、抽象類與介面的相同點
1、兩者都是抽象類,都不能被例項化。
2、介面的實現類及抽象類的子類都必須實現已經宣告的抽象方法(當然啦,除非介面的實現類及抽象類的子類也是抽象的)
四、抽象類與介面的區別
1、抽象類中的方法可以有方法體,就是能實現方法的具體功能,但是介面中的方法不行。
2、抽象類中的成員變數可以是各種型別的,但是介面中的只能是public static final型別的。
3、一個類只能繼承一個抽象類,而但是可以實現多個介面。
4、介面需要實現,用implements;而抽象類需要繼承,用extends。
5、介面中的方法必須都實現,而抽象類中的方法可以選擇性的實現。
五、什麼時候使用抽象類和介面
1、如果擁有一些方法並且想讓它們中的一些預設實現,就用抽象類。
2、如果想實現多繼承,就必須要用介面。由於Java中不支援多繼承,子類不能夠繼承多個類,但可以實現多個介面。
3、如果基本功能不斷改變,那麼要使用抽象類。因為不斷改變功能時,用介面的話,就需要改變所有實現了該介面的類。