首先,需要了解抽象類:
聲明方法而不去實現它的類叫做抽象類(abstract class)。①抽象類中可以沒有抽象方法,但抽象方法一定在抽象類中;②抽象類不能被實例化(即不能new一個對象),抽象方法也不能自己實例化(可以被子類繼承后實例化);③子類必須實例化抽象父類的所有方法,或者將子類聲明名為abstract,然后選擇性實現父類的方法。④抽象類可以繼承實體類,前提是實體類必須有明確的構造函數。
了解接口(interface):
接口是抽象類的變體。①接口中的所有方法都是抽象的;②多繼承可以實現接口而獲得;③接口只可定義是static final 成員變量;④接口可以繼承接口,抽象類可以實現接口;⑤接口更關注“實現了什么功能”,而不管“怎么實現”。
以下參考自:https://blog.csdn.net/longtengshuimeng/article/details/51620481
相同點:
1.兩者都是抽象類,都不能實例化
2.interface 實現類及abstract class 的子類都必須要實現已經聲明的抽象方法。
不同點:
1.interface 實現,要用implements,而abstract class的實現,要用extends.
2.一個類可以實現多個interface,但一個類只能繼承一個abstract class.
3.interface強調特定功能的實現,而abstract class強調所屬關系
4.盡管interface實現類及abstract class的子類都必須要實現相應的抽象方法,但實現的形式不同。interface中的每一個方法都是抽象方法,都只是聲明的(declaration,沒有方法體),必須要實現。而子類如果被關鍵子abstract關鍵字修飾,可以有選擇地實現。
抽象類的這個選擇有兩點含義:一是Abstract class中並非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子類必須實現。那些沒有abstract class的方法,在abstract class中必須定義方法體。二是abstract class的子類在繼承它時,對非抽象方法即可以直接繼承,也可以覆蓋;而對抽象方法,可以選擇實現,也可以通過再次聲明其方法為抽象的方式,無需實現,留給其子類來實現,但此類必須也聲明為抽象類,即是抽象類,當然也不能實例化。
interface是完全抽象的,只能聲明方法,而且只能聲明public的方法,不能聲明private 及protected的方法,不能定義方法體,也不能聲明實例變量。
注意:
1.有抽象方法的類一定是抽象類。但是抽象類中不一定都是抽象方法,也可以全是具體方法。abstract修飾符在修飾類時必須放在類名前。abstract修飾方法就是要求其子類(實現)這個方法,調用時就可以以多態方式調用子類覆蓋(實現)后的方法,除非子類本身也是抽象類。
2.父類是抽象類,其中有抽象方法,那么子類繼承父類,並把父類中的所有抽象方法都實現(覆蓋)了,子類才有創建對象的實例的能力,否則子類也必須是抽象類。
extends 是繼承父類,只要那個類不是聲明為final就能繼承。java中不支持多重繼承,但是可以用接口來實現,這樣就要用到implements.繼承只能繼承一個類,但implements可以實現多個接口,用逗號分開就行了。
與extends的差別:extends是繼承某個類,繼承之后可以使用父類的方法也可以重寫父類的方法;implements是實現多個接口,接口的方法必須重寫才能使用。需要注意以下幾點:
1.接口中一般定義的是常量和抽象方法。抽象類中可以包含抽象方法,也可以有非抽象方法,但是有抽象方法的類一定是抽象類。抽象方法不能有方法體。
2.接口(interface)中,方法只能定義抽象方法而且默認是public。常量則是public static final修飾的(不管有沒有這些修飾符,方法和常量默認具有這種屬性)。
3.一個類可以實現多個接口(這點和繼承要有所區別)。
4.接口可以繼承其他的接口,並添加新的屬性和抽象方法。
5.在類中實現接口的方法時必須加上public修飾符。
靜態變量(相當於常量)可以用類名.靜態變量名直接使用,接口又是類的一種,所以接口名.靜態變量名可用;
接口引用.靜態變量是多態的體現。