在数据结构和嵌套类上进行迭代



下面有一些迭代器的代码,但我很难理解它的工作原理。让我特别困惑的是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;
}

回答您关于"静态"类的问题:

内部类和其他类一样。它只是在外部类中以名称命名。然而,内部阶级有两种风格。静态风味:

  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();
    }
}

实际上,主方法的最后两个调用是在做同样的事情。您需要一些不同的语法来从包含类之外创建实例。但您会注意到,在这两种情况下,您都需要事先创建一个Outer实例,而要获得StaticInner实例,您没有。

您还将注意到,在非静态实例中,您可以访问其包含实例的私有字段"value"。

你可能想看看这里:

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

相关内容

  • 没有找到相关文章

最新更新