因爲java只允許單繼承,所以抽象類受到了極大的限制。但是接口一點定義,被其他類廣泛應用時,其擴張就變得很困難。而抽象類的演變比接口的演變容易得多。
骨架通過對導出的每個重要接口都提供一個抽象的骨架實現類,把接口和抽象類的優點結合起來 。接口的作用仍然是定義類型,但是骨架實現類接管了所有域接口實現相關的工作 。
static List<Integer> intArrayAsList(final int[] a){
if(a == null)
throw new NullPointerException();
return new AbstractList<Integer>() {
public Integer get(int i){
//自動裝箱
return a[i];
}
public Integer set(int i,int val){
int oldval = a[i];
//自動拆箱
a[i] = val;
自動裝箱
return oldval;
}
public int size(){
return a.length;
}
};
}
通過對Java源碼的學習我們會發現,AbstractCollection實現了Collection接口,List接口繼承自Collection接口,AbstractList又繼承了AbstractCollection類,並且實現了List接口。諸如此種的還有AbstarctSet,AbstarctList,AbstarctMap,都是繼承了一個抽象類,又實現了一個上層接口。這樣做的好處:通過對你導出的每個重要接口都提供一個抽象的骨架實現類(skeletal implementation)類,把接口和抽象類的優點結合起來。接口的作用仍然是定義類型,但是骨架實現類接管了所有與接口實現相關的工作。
骨架實現方法:
首先是,接口定義了功能性的方法;
然後,一個抽象類實現了這個接口,作爲骨架實現類,它完成了接口的一部分實現(默認實現)
最後是一個普通類,繼承自這個抽象的骨架實現類,並完成了抽象類中未實現的方法。