问题描述
由于刚学java,对于javaAPI中接口中的方法可以直接使用感到非常好奇,比如上面publicinterfaceIterator<E>是抽象的,但我可以使用booleanhasNext();它是在哪里实现的,我怎么可以通过Iterator对象来使用它。它背后的实现机制是什么?还是我根本就理解错了?求大神指点!!!
解决方案
解决方案二:
你说的iterator对象是i的引用吧,只能是实现了iterator接口的类的实例对象,既然继承了itrator就继承了itratoa的两个方法hasnext和next.hasnextnext方法实现的机制我不知道,但是hasnext返回的是集合是否还有下一个元素可以用来遍历,如果没有就返回一个false
解决方案三:
接口和抽象类是不可以实例化的,但可以声明变量吧,并可以指向实现了此接口类型的任何对象吧;以ArrayList为例:你看下API就会发现ArrayList实现了Iterable,而Iterable有个方法:Iterator<T>iterator()返回一个在一组T类型的元素上进行迭代的迭代器。既然如此,a.Iterator是不是返回了一个实现了Iterator接口对象呢?而ArrayList的父类是AbstractList,你打开此类的iterator方法,就可以看到一个newItr()的语句,然后点击这个Itr,你就会发现privateclassItrimplementsIterator<E>是不是清楚了?
解决方案四:
这个涉及到的是多态的知识,题主可以去看看List<String>list=newArrayList<>();Iteratorit=list.iterator();System.out.println(it.getClass());
getClass()返回的是一个对象运行时的类型输出的结果是ArrayList$Itr所以it实际上的类型是ArrayList$Itr,而不是Iterator接口不能用来创建实例,但是可以用来声明变量之所以用Iterator来声明变量,是因为我们通常不知道调用iterator()方法后得到的是什么类型的迭代器,而Iterator是所有迭代器的父类,所以就需要使用Iterator来声明变量就像Object是所有类的父类一样Objectobj=newString("爱问人家的人");Objectobj=newInteger(5);
这样写都是没有问题的
解决方案五:
谢谢!哎,还是不会看API啊,要多看多写啊
解决方案六:
可以定义接口型的变量,指向接口的具体实现,这样这个接口变量就灵活很多楼主多看看接口和abstract类,看看接口定义的好处设计模式中,大量应用了接口的定义,spring也是面向接口的编程,易于更改具体的实现。
解决方案七:
哈哈当年我也有这样的疑惑总是搞不清到底哪儿实现了这个方法其实接口实例化的时候使用的具体的实现类来实例化的比如List接口,一般用List<Object>list=newArrayList<>();这样的方式来实例化。所以当list.add(newObject())的时候,其实用的是ArrayList里面的add方法。