抽象類的特性
- 不允許被實例化,只能被繼承,不能new一個抽象類的對象出來;
- 抽象類可以包含屬性和方法。方法既可以包含實現,也可以不包含,不包含代碼實現的方法叫做抽象方法;
- 子類繼承抽象類,必須實現抽象類中所有的抽象方法。
接口的特性
- 接口不能包含屬性(也就是成員變量);
- 接口只能聲明方法,不能包含代碼實現;
- 類實現接口時,必須實現接口中聲明的所有方法;
兩者區別
抽象類表示的是is-a的關係,而接口表示的是has-a的關係,表示具有某種功能。對於接口,還有一種叫法,稱爲協議(contract)。
抽象類和接口能解決的編程問題
1.抽象類是爲代碼複用而生的。多個子類可以繼承抽象類中定義的屬性和方法,避免在子類中,重複編寫相同代碼。
2.抽象類更多是爲了代碼複用,而接口更側重於解耦。接口實現了約定和實現相分離,可以降低代碼間的耦合性,提高代碼可擴展性。
該用抽象類還是接口?
如果要表示is-a的關係,且爲了解決代碼複用問題,就用抽象類;
如果要表示一種has-a的關係,且是爲了解決抽象而非代碼複用問題,就可以使用接口。
抽象類是自下而上的設計思路,先有子類的代碼重複,然後再抽象成上層父類;而接口正好相反,是一種自上而下的設計思路。編程時,一般先設計接口,然後再去考慮具體實現。