由于想研究下接口技术,就看了下LinkedList的源码,发现了个不解的问题
现在在网吧没工具画图,我就随便说下,大家有条件的参考下j2se的API对照下
LinkedList extends AbstractSequentialList implements List ...
而
AbstractSequentialList extends AbstractList
又
AbstractList extends AbstractCollection implements List问题出现在这了
既然 LinkedList --> AbstractSequentialList --> AbstractList --> List
为什么 LinkedList 又要再去实现 List接口呢?
有点感觉多此一举啊。不理解。。假设LinkedList 如此定义
public class LinkedList<E>
extends AbstractSequentialList<E>
implements Deque<E>, Cloneable, Serializable /**源码中多了个List*/
我们在使用的时候照样可以
List list = new LinkedList();
为什么sun要重复实现List?期待高人指点
现在在网吧没工具画图,我就随便说下,大家有条件的参考下j2se的API对照下
LinkedList extends AbstractSequentialList implements List ...
而
AbstractSequentialList extends AbstractList
又
AbstractList extends AbstractCollection implements List问题出现在这了
既然 LinkedList --> AbstractSequentialList --> AbstractList --> List
为什么 LinkedList 又要再去实现 List接口呢?
有点感觉多此一举啊。不理解。。假设LinkedList 如此定义
public class LinkedList<E>
extends AbstractSequentialList<E>
implements Deque<E>, Cloneable, Serializable /**源码中多了个List*/
我们在使用的时候照样可以
List list = new LinkedList();
为什么sun要重复实现List?期待高人指点
这个类是 List 的实现类,而不用去翻其父类的继承链才知道这是一个 List 的实现类。这样做以我看来就是重申强调一下,至于其他的也没有什么意义了。
AbstractSequentialList, AbstractList 这些抽象父类。
如果一个系统存在以下的调用
public void getInfos(ArrayList list){
//....
}
如果以后,觉得用LinkedList比用ArrayList有更高的效率,那么我们就要去修改这个接口为
public void getInfos(LinkedList list){
//....
}
一来这样要经常去修改调用的源代码,而且也会造成维护的困难,但如果我们的方法是这样定义的:
public void getInfos(List list){
//...
}
这样我们就可以用传各样的List去调用,也不用修改代码。
“依据接口编程,而不是实现编程”是面向对象的重要原则,不然我们开发的系统,就会遇到维护上的难题