1.foreach语法是适用于数组和Iterable的。foreach语法实现原理可以参考:http://blog.csdn.net/raylee2007/article/details/50951357
容器之所以可以用于foreach,是因为容器默认实现了Iterable接口,而该接口包含的iterator()方法能够产生Iterator对象(迭代器)。
如下例,C是容器类,可以直接用于foreach语法中:
import java.util.*;
public class Test3{
public static void main(String[] args){
Collection<Integer> c = new ArrayList<Integer>(Arrays.asList(1,2,3,4,5));
for(Integer i : c){
System.out.println(i);
}
}
}
2.一个类只要实现了Iterable接口,覆盖了它的iterator()方法从而生成Iterator对象,就能像容器一样用于foreach语法。
如下例,Test2继承Iterable接口,并覆盖了该接口的iterator()方法,该方法返回的是继承了Iterator的匿名内部类,该内部类实现了Iterator的3个方法:hasNext()、next()、remove()。那么Test2类的对象就能直接用于foreach语法了。(foreach语法里遍历的就是next()返回的内容)
import java.util.*;
public class Test2 implements Iterable<String>{
String[] s = {"i ","am ","xyy"};
public Iterator<String> iterator(){
return new Iterator<String>(){
int count;
public boolean hasNext(){
return count<s.length;
}
public String next(){
return s[count++];
}
public void remove(){
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args){
Test2 t =new Test2();
for(String s:t){
System.out.print(s);
}
}
}
3.依上所述,让一个类适用于foreach语法的方法是让该类继承Iterable接口,能用该接口的iterator()方法产生迭代器;而不是这个类直接继承Iterator使自身成为一个迭代器
下面的Test1就是一个类直接继承Iterator的例子,这个类不能用于foreach语法,注释行如果运行会报错如下:
Test1.java:20: 错误: for-each 不适用于表达式类型
for(Test1 tt : t){}
^
要求: 数组或 java.lang.Iterable
import java.util.*;
public class Test1 implements Iterator<String>{
String[] s = {"i ","am ","xyy"};
int count;
public boolean hasNext(){
return count<s.length;
}
public String next(){
return s[count++];
}
public void remove(){
throw new UnsupportedOperationException();
}
public static void main(String[] args){
Test1 t = new Test1();
while(t.hasNext()){
System.out.print(t.next());
}
//for(Test1 tt : t){}
}
}
由于Test1这个类是直接继承了Iterator,虽不能用于foreach语法,但可以直接调用覆盖后的hasNext()方法来达到遍历的目的。