public class IterableClass implements Iterable<String> { protected String[] words = ("And that is how "+
"we know the Earth to be banana-shaped.").split(" ");
public Iterator<String> iterator(){
return new Iterator<String>(){
private int index=0;
public boolean hasNext(){
System.out.println("a");
return index<words.length;
}
public String next(){
System.out.println("a");
return words[index++];
}
public void remove(){
throw new UnsupportedOperationException();
}
};
} public static void main(String[] args) {
// TODO Auto-generated method stub
for(String s : new IterableClass()){
System.out.println(s);
}
}}
为什么new IterableClass()直接写这个就可以遍历到words数组呢?
而且直接就进入匿名内部类的重写方法中,这是什么原理
实现该接口的方法iterator(),在使用foreach遍历时就会通过iterator的返回值来遍历,也就是你的匿名内部类的实例
return new Iterator<String>(){
private int index=0;
public boolean hasNext(){
System.out.println("a");
return index<words.length;
}
public String next(){
System.out.println("a");
return words[index++];//最终就是从这里获取到words的}
public void remove(){
throw new UnsupportedOperationException();
}
};
for(String s : new IterableClass()),然后再遇到new IterableClass()就会进入到那个实现Iterator接口的匿名内部类中
new IterableClass() 这个已经实现了Iterable 接口了,也就是拥有了这里面的遍历方法了。而且这种写法还是蛮值得推荐的!