java - 迭代数据结构和嵌套类

标签 java loops linked-list

下面有一些迭代器的代码,但我无法理解它是如何工作的。特别让我困惑的是 public Node<T> front;for陈述。

Front 是对静态嵌套类的引用,在 for 循环中我们有 LinkedList.Node<String> ptr = list.front 。该操作的左侧只是访问外部类,然后访问我们创建的静态嵌套类 ptr引用。该操作的右侧使用外部类的对象来访问前面的引用,该引用也是静态嵌套类。

那么左边和右边不是同一个东西吗?为什么代码将一侧设置为等于另一侧?我知道提供的代码并不完整 - 我没有编写它。我只是想理解它。

public class LinkedList<T> {
    public static class Node<E> {
        public E data;
        public Node<E> next;
    }
    public Node<T> front;

    ...code omitted...
}


LinkedList<String> list = new LinkedList<String>();

...code omitted...

for (LinkedList.Node<String> ptr = list.front; ptr != null; ptr = ptr.next) {
    System.out.println(ptr.data);
}

最佳答案

首先,“front”不是对静态嵌套类的引用。它是对该类的“实例”的引用,这是一个重要的区别。将该类视为创建实例的模板。

所以在某个时刻,有人会创建该对象:

LinkedList<String> list = new LinkedList<String>();
list.front = new LinkedList.Node<String>();
list.front.data = "foo";

然后可能会在列表中添加一个节点(这通常是更改 LinkedList 的方式,因为附加操作的成本很高)

// Create the new node
LinkedList.Node<String> newNode = new LinkedList.Node<String>();
newNode.data = "bar";
// Since we're prepending, the existing front becomes the next for this node.
newNode.next = list.front;
// This node becomes the front of the list
list.front = newNode;

至于for语句,可以把它想象成一个while循环,这样读起来更容易一些

LinkedList.Node<String> ptr = list.front;
while (ptr != null) {
  // do something
  ptr = ptr.next;
}

回答有关“静态”类的问题:

内部类就像任何其他类一样。它只是在外部类中命名。然而,内部类有两种风格。静态 flavor :

  1. 可以自行实例化
  2. 与外部类的任何特定实例无关

相反,非静态内部类:

  1. 必须通过其包含类的实例实例化
  2. 有权访问其包含类的实例的所有字段和方法。

以这段代码为例:

public class Outer {
    private int value = 10;

    public static class StaticInner {

    }

    public class Inner {
        public void foo() {
            System.out.println(value);
        }
    }

    public Inner createInner() {
        return new Inner();
    }

    public static void main(String[] args) {
        Outer outer = new Outer();
        StaticInner staticInner = new StaticInner();
        Inner inner = outer.new Inner();
        Inner inner2 = outer.createInner();
    }
}

实际上,main 方法的最后两次调用正在做同样的事情。您需要使用一些不同的语法来从包含类的外部创建实例。但您会注意到,在这两种情况下,您之前都需要创建 Outer 实例,而要获取 StaticInner 实例,则不需要。

您还会注意到,在非静态实例中,您可以访问其包含实例的私有(private)字段“值”。

您可能想看这里:

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

关于java - 迭代数据结构和嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23282781/

相关文章:

java - 将 RTC/Jazz 中的两个基线与纯 Java 进行比较

java - 无法取消异步任务执行

javascript - 如何使用 Javascript 和 PHP 同时继续两种类型的循环

php - 遍历日期范围内的所有月份?

javascript - JQuery 循环隐藏项目

java - Java PERM 生成在哪里?

java - 使用 Google APIs Java 客户端进行连接和授权

c++ - 在添加新记录和访问记录时遇到问题

c++ - Valgrind报告在运行之间发生变化的许多地方出现内存泄漏

javascript - 在 ES6 中使链表可迭代