接口和內(nèi)部類為我們提供了一種將接口與實(shí)現(xiàn)分離的更加結(jié)構(gòu)化的方法辙浑。
接口
接口中的方法默認(rèn)是public abstract方法,所以累在實(shí)現(xiàn)接口方法是必須給出方法體,并且一定要用public來修飾,而且接口中的常量默認(rèn)是public static常量尼摹。
接口也是可以被繼承的,即可以通過關(guān)鍵字extends聲明一個(gè)接口是另一個(gè)接口的子接口剂娄,由于父接口中的方法和常量都是public的窘问,子接口將繼承父接口中的全部方法和常量。另外要說的是宜咒,接口中的屬性都是常量惠赫。
接口的意義
你對(duì)一些類是否具有這個(gè)功能非常關(guān)心,但不不關(guān)心功能的具體體現(xiàn)故黑,那么就需要這些類都實(shí)現(xiàn)一個(gè)接口儿咱。
接口做參數(shù)
如果一個(gè)方法的參數(shù)是接口類型庭砍,就可以將任何實(shí)現(xiàn)該接口類的實(shí)例的引用傳遞給該參數(shù),那么該方法就可以通過該接口參數(shù)去回調(diào)類實(shí)現(xiàn)的接口方法混埠。這個(gè)比較少用怠缸,但是還是挺實(shí)用的,后來可以用用钳宪。其實(shí)這么理解會(huì)比較好:直接把該接口參數(shù)當(dāng)做是一個(gè)類對(duì)象揭北,我們用它來調(diào)用該類的方法。
接口回調(diào)
接口會(huì)有這么一個(gè)特征吏颖,如果聲明一個(gè)接口對(duì)象搔体,然后調(diào)用該接口的方法functionA( ),它會(huì)去調(diào)用實(shí)現(xiàn)該接口的類的方法functionA( )半醉,因此我們可以利用這個(gè)特征解決一些問題疚俱。比如在擁有ListView的Activity中,點(diǎn)擊Item中的一個(gè)Button缩多,然后要進(jìn)行一些與Activity的交互呆奕,在BaseAdapter里顯然不方便這樣操作,這個(gè)時(shí)候就可以傳一個(gè)接口對(duì)象進(jìn)去衬吆,而接口方法被Activity實(shí)現(xiàn)梁钾,那就可以利用這個(gè)接口對(duì)象去調(diào)用Activity的方法了。這就是傳說中監(jiān)聽者模式逊抡。
實(shí)例
1.創(chuàng)建一個(gè)接口姆泻,里面寫好需要用到的函數(shù)。
public interface ItemChangInterFace {
void deleteCart(String productId);
void setListNum(int num,int whichItem);
}
2.Activity實(shí)現(xiàn)該接口秦忿。
implements ItemChangInterFace...
@Override
public void deleteCart(final String productId) {...
@Override
public void setListNum(int quantity,int whichItem) {...
3.把該接口對(duì)象傳入需要調(diào)用它的方法的地方麦射,如果是被Activity實(shí)現(xiàn)了蛾娶,那么傳this就可以灯谣。
cartListAdapter = new CartListAdapter(getActivity(), cartItemList,this);
4.調(diào)用的地方聲明一個(gè)接口對(duì)象,接受構(gòu)造函數(shù)來的接口對(duì)象蛔琅,然后就可以用此對(duì)象調(diào)用被Activity實(shí)現(xiàn)的方法胎许。
private ItemChangInterFace itemChangInterFace;
public CartListAdapter(Context context, List<CartItemEntity> list, ItemChangInterFace itemChangInterFace) {
this.itemChangInterFace = itemChangInterFace;
}
itemChangInterFace.deleteCart(list.get(i).getProduct_id());