由于刚学java,对于java  API中接口中的方法可以直接使用感到非常好奇,比如上面public interface Iterator<E> 是抽象的,但我可以使用boolean hasNext();
它是在哪里实现的,我怎么可以通过 Iterator对象来使用它。它背后的实现机制是什么?还是我根本就理解错了?
求大神指点!!!

解决方案 »

  1.   

    你说的iterator对象是i的引用吧,只能是实现了iterator接口的类的实例对象,既然继承了itrator 就继承了itratoa的两个方法 hasnext和next.  hasnext next 方法实现的机制我不知道,但是hasnext返回的是 集合是否还有下一个元素可以用来遍历,如果没有就返回一个false
      

  2.   

    接口和抽象类是不可以实例化的,但可以声明变量吧,并可以指向实现了此接口类型的任何对象吧;以ArrayList为例:
    你看下API就会发现ArrayList实现了Iterable, 而Iterable有个方法:
    Iterator<T> iterator()  
    返回一个在一组 T 类型的元素上进行迭代的迭代器。既然如此,a.Iterator是不是返回了一个实现了Iterator接口对象呢?
    而ArrayList的父类是AbstractList,你打开此类的iterator方法,就可以看到一个new Itr()的语句,然后点击这个Itr,你就会发现
     private class Itr implements Iterator<E> 是不是清楚了?
      

  3.   

    这个涉及到的是多态的知识,题主可以去看看List<String> list = new ArrayList<>();
    Iterator it = list.iterator();
    System.out.println(it.getClass());
    getClass() 返回的是一个对象运行时的类型
    输出的结果是 ArrayList$Itr
    所以 it 实际上的类型是 ArrayList$Itr,而不是 Iterator
    接口不能用来创建实例,但是可以用来声明变量
    之所以用 Iterator 来声明变量,是因为我们通常不知道调用 iterator() 方法后得到的是什么类型的迭代器,而 Iterator 是所有
    迭代器的父类,所以就需要使用 Iterator 来声明变量就像 Object 是所有类的父类一样Object obj = new String("爱问人家的人");
    Object obj = new Integer(5);这样写都是没有问题的
      

  4.   

    谢谢!哎,还是不会看API啊,要多看多写啊
      

  5.   

    可以定义接口型的变量,指向接口的具体实现,这样这个接口变量就灵活很多
    楼主多看看接口和abstract类,看看接口定义的好处
    设计模式中,大量应用了接口的定义,spring也是面向接口的编程,易于更改具体的实现。
      

  6.   

    哈哈 当年我也有这样的疑惑  总是搞不清到底哪儿实现了这个方法 其实 接口实例化的时候使用的具体的实现类来实例化的比如 List接口,一般用 List<Object> list = new ArrayList<>();这样的方式来实例化。
    所以当list.add(new Object())的时候,其实用的是 ArrayList里面的add方法。
      

  7.   

    初学Java,没有必要去深究Java中一些类的方法的底层实现。