抽象類的特性
- 不允許被實(shí)例化湿酸,只能被繼承婿屹,不能new一個(gè)抽象類的對(duì)象出來;
- 抽象類可以包含屬性和方法推溃。方法既可以包含實(shí)現(xiàn)昂利,也可以不包含,不包含代碼實(shí)現(xiàn)的方法叫做抽象方法;
- 子類繼承抽象類蜂奸,必須實(shí)現(xiàn)抽象類中所有的抽象方法犁苏。
接口的特性
- 接口不能包含屬性(也就是成員變量);
- 接口只能聲明方法扩所,不能包含代碼實(shí)現(xiàn)围详;
- 類實(shí)現(xiàn)接口時(shí),必須實(shí)現(xiàn)接口中聲明的所有方法祖屏;
兩者區(qū)別
抽象類表示的是is-a的關(guān)系助赞,而接口表示的是has-a的關(guān)系,表示具有某種功能袁勺。對(duì)于接口雹食,還有一種叫法,稱為協(xié)議(contract)魁兼。
抽象類和接口能解決的編程問題
1.抽象類是為代碼復(fù)用而生的婉徘。多個(gè)子類可以繼承抽象類中定義的屬性和方法,避免在子類中咐汞,重復(fù)編寫相同代碼盖呼。
2.抽象類更多是為了代碼復(fù)用,而接口更側(cè)重于解耦化撕。接口實(shí)現(xiàn)了約定和實(shí)現(xiàn)相分離几晤,可以降低代碼間的耦合性,提高代碼可擴(kuò)展性植阴。
該用抽象類還是接口蟹瘾?
如果要表示is-a的關(guān)系,且為了解決代碼復(fù)用問題掠手,就用抽象類憾朴;
如果要表示一種has-a的關(guān)系,且是為了解決抽象而非代碼復(fù)用問題喷鸽,就可以使用接口众雷。
抽象類是自下而上的設(shè)計(jì)思路,先有子類的代碼重復(fù)做祝,然后再抽象成上層父類砾省;而接口正好相反,是一種自上而下的設(shè)計(jì)思路混槐。編程時(shí)编兄,一般先設(shè)計(jì)接口,然后再去考慮具體實(shí)現(xiàn)声登。