Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java迭代器变量作用域_Java_Iterator - Fatal编程技术网

Java迭代器变量作用域

Java迭代器变量作用域,java,iterator,Java,Iterator,这是我刚刚编写的代码的一部分。基本上,类Document实现了Iterable接口。迭代器将像链表一样遍历节点。在remove方法中,我使用了nodeMap的引用,它位于文档类范围内。然而,这个引用应该引用迭代器本身,那么它怎么能找到那个对象呢?或者,迭代器是文档的子类 我以前没想过这个问题。突然,我把自己搞糊涂了 public class Document implements Iterable<DocumentNode> { Map<Integer, Documen

这是我刚刚编写的代码的一部分。基本上,类
Document
实现了
Iterable
接口。迭代器将像链表一样遍历节点。在
remove
方法中,我使用了
nodeMap
的引用,它位于
文档
类范围内。然而,
这个
引用应该引用
迭代器本身,那么它怎么能找到那个对象呢?或者,
迭代器是
文档的子类

我以前没想过这个问题。突然,我把自己搞糊涂了

public class Document implements Iterable<DocumentNode> {
    Map<Integer, DocumentNode> nodeMap;

    public Iterator<DocumentNode> iterator() {
        return new Iterator<DocumentNode>() {
            DocumentNode node = nodeMap.get(0);

            @Override
            public boolean hasNext() {
                return node != null && node.next != null; 
            }

            @Override
            public DocumentNode next() {
                if (node == null) {
                    throw new IndexOutOfBoundsException();
                }
                return node.next;
            }

            @Override
            public void remove() {
                if (node == null) {
                    throw new IndexOutOfBoundsException();
                }
                if (node.prev != null) {
                    node.prev.next = node.next;
                }
                if (node.next != null) {
                    node.next.prev = node.prev;
                }
                nodeMap.remove(node.documentID);
            }
        };
    }
}
公共类文档实现Iterable{
地图节点地图;
公共迭代器迭代器(){
返回新的迭代器(){
DocumentNode=nodeMap.get(0);
@凌驾
公共布尔hasNext(){
返回节点!=null&&node.next!=null;
}
@凌驾
公共文档节点下一步(){
if(node==null){
抛出新的IndexOutOfBoundsException();
}
返回node.next;
}
@凌驾
公共空间删除(){
if(node==null){
抛出新的IndexOutOfBoundsException();
}
如果(node.prev!=null){
node.prev.next=node.next;
}
if(node.next!=null){
node.next.prev=node.prev;
}
nodeMap.remove(node.documentID);
}
};
}
}

迭代器是类
文档
的匿名内部类的实例。有两种内部类:

  • 静态内部类不附加到外部类的实例,它们只能访问自己的成员和外部类的静态成员
  • 非静态内部类拥有对外部类实例的引用,外部类是在其创建的上下文中创建的,因此它们可以直接访问外部类的非静态成员。这就是代码中的迭代器是其实例的类

迭代器是类
文档
的匿名内部类的实例。有两种内部类:

  • 静态内部类不附加到外部类的实例,它们只能访问自己的成员和外部类的静态成员
  • 非静态内部类拥有对外部类实例的引用,外部类是在其创建的上下文中创建的,因此它们可以直接访问外部类的非静态成员。这就是代码中的迭代器是其实例的类

你的意思是:为什么
Iterator
匿名内部类中可以访问
nodeMap
?你的意思是:为什么
Iterator
匿名内部类中可以访问
nodeMap