接口和內部類為我們提供了一種將接口與實現分離的更加結構化的方法。
接口
接口中的方法默認是public abstract方法,所以累在實現接口方法是必須給出方法體,并且一定要用public來修飾,而且接口中的常量默認是public static常量。
接口也是可以被繼承的,即可以通過關鍵字extends聲明一個接口是另一個接口的子接口,由于父接口中的方法和常量都是public的,子接口將繼承父接口中的全部方法和常量。另外要說的是,接口中的屬性都是常量。
接口的意義
你對一些類是否具有這個功能非常關心,但不不關心功能的具體體現,那么就需要這些類都實現一個接口。
接口做參數
如果一個方法的參數是接口類型,就可以將任何實現該接口類的實例的引用傳遞給該參數,那么該方法就可以通過該接口參數去回調類實現的接口方法。這個比較少用,但是還是挺實用的,后來可以用用。其實這么理解會比較好:直接把該接口參數當做是一個類對象,我們用它來調用該類的方法。
接口回調
接口會有這么一個特征,如果聲明一個接口對象,然后調用該接口的方法functionA( ),它會去調用實現該接口的類的方法functionA( ),因此我們可以利用這個特征解決一些問題。比如在擁有ListView的Activity中,點擊Item中的一個Button,然后要進行一些與Activity的交互,在BaseAdapter里顯然不方便這樣操作,這個時候就可以傳一個接口對象進去,而接口方法被Activity實現,那就可以利用這個接口對象去調用Activity的方法了。這就是傳說中監聽者模式。
實例
1.創建一個接口,里面寫好需要用到的函數。
public interface ItemChangInterFace {
void deleteCart(String productId);
void setListNum(int num,int whichItem);
}
2.Activity實現該接口。
implements ItemChangInterFace...
@Override
public void deleteCart(final String productId) {...
@Override
public void setListNum(int quantity,int whichItem) {...
3.把該接口對象傳入需要調用它的方法的地方,如果是被Activity實現了,那么傳this就可以。
cartListAdapter = new CartListAdapter(getActivity(), cartItemList,this);
4.調用的地方聲明一個接口對象,接受構造函數來的接口對象,然后就可以用此對象調用被Activity實現的方法。
private ItemChangInterFace itemChangInterFace;
public CartListAdapter(Context context, List<CartItemEntity> list, ItemChangInterFace itemChangInterFace) {
this.itemChangInterFace = itemChangInterFace;
}
itemChangInterFace.deleteCart(list.get(i).getProduct_id());