List   list=new   Arraylist();   
list.add( "aaa ");   
list.add( "bbb ");   
Iterator   it=list.iterator();   
while(it.hasNext())   
{   
System.out.println(it.next());   
}   
Iterator接口中的方法都是没有方法体的抽象方法,所以hasNext()和it.next()没有实现,查看Arraylist()的JDK源码发现它也没有实现这些方法,唯一看到具体的实现是在其父类AbstractList这个类里,查找源代码可以发现,AbstractList这个类里有个叫Itr的内部类实现了Iterator接口的所有内容,可是Itr的内部类声明是:private class Itr implements Iterator<E>,也就是私有的,那么就不可以被子类继承。可为什么还是可以直接用it.hasNext()和it.next(),表示不明白,求解释?

解决方案 »

  1.   

    关键是list.iterator()这句话,
    它执行了AbstractList里的    public Iterator<E> iterator() {
    return new Itr();
        }既然返回的是java.util.AbstractList$Itr的实例,
    所以it.hasNext()和it.next()有什么不可执行的。
      

  2.   

    list.iterator()返回了1个实例化Iterator的对象。
    不管这个实例化的类是内部类还是什么,外面只使用了Iterator接口的方法,
    例如
    hasNext()
    next()
    这些方法又都是public的那么就可以使用的呀。这就是接口的好处,外面调用的人不关心实现类的实现。
    只要你实现了我的接口的方法,我就只调用那么些方法,不关心你怎么实现的。