因为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)类,把接口和抽象类的优点结合起来。接口的作用仍然是定义类型,但是骨架实现类接管了所有与接口实现相关的工作。
骨架实现方法:
首先是,接口定义了功能性的方法;
然后,一个抽象类实现了这个接口,作为骨架实现类,它完成了接口的一部分实现(默认实现)
最后是一个普通类,继承自这个抽象的骨架实现类,并完成了抽象类中未实现的方法。