これは JPL からコピーされたもので (以下のコメントを参照)、インポートと 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 の意味を知ることができますか? インスタンスに明示的に保存されていません。議論から、メソッドローカル内部クラスはメソッド内で宣言された変数を使用できません。暗黙的にコピーされ、反復インスタンスに保存されたようです。それを確認し、証明していただけますか?参照を見つけることができませんでした。
最初が真 (最後のパラメーターが保存された) の場合、そのような暗黙的な保存に依存することは良いプログラミング手法と見なされますか? それが Java 仕様にある場合は申し訳ありませんが、私の 2 番目の Q は関係ありませんが、やはり見つかりませんでした。
結果は 5 個の null です。配列の要素を初期化せずに残しました。