这是从 JPL 复制的(见下面的评论),我添加了 import 和 main():
import java.util.*;
/**
* @From "The Java Programming Language" by Arnold, Gosling, Holmes
* (5.3. Local Inner Classes)
*/
public class LocalInnerClassAppl {
public static Iterator<Object> walkThrough(final Object[] objs) {
class Iter implements Iterator<Object> {
private int pos = 0;
@Override
public boolean hasNext() {
return (pos < objs.length);
}
@Override
public Object next() throws NoSuchElementException {
if (pos >= objs.length)
throw new NoSuchElementException();
return objs[pos++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
}
return new Iter();
}
public static void main(String[] args) {
Object[] objects = new Object[5];
Iterator<Object> iter = walkThrough(objects);
while (iter.hasNext())
System.out.println(iter.next());
}
}
我的问题是:
当调用 iter.hasNext() 时,iter 怎么知道 objs 是什么意思?它没有明确保存在实例中。从讨论方法局部内部类不能使用在方法中声明的变量,它看起来像是被隐式复制并保存在 iter 实例中。你能证实和证实吗?我没有找到参考。
如果第一个为真(保存了最终参数),那么依赖这种隐式保存是否被认为是一种好的编程习惯?抱歉,如果它在 Java 规范中,那么我的第二个 Q 是无关紧要的,但同样 - 我没有找到它。
结果是 5 个空值,我未初始化数组的元素。