我下面有一些用于迭代器的代码,但在理解其工作方式时遇到了麻烦。特别使我困惑的是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;
}
要回答有关“静态”类的问题:
内部类就像其他任何类一样。它只是在外部类中命名空间。但是,内部类有两种风格。静态风味:
可以自己实例化
与外部类的任何特定实例无关
相反,一个非静态内部类:
必须通过其包含类的实例实例化
可以访问其所包含类的实例的所有字段和方法。
请看以下代码示例:
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实例,则不需要。
您还将注意到,在非静态实例中,您可以访问包含实例的私有字段“值”。
您可能要看这里:
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
关于java - 遍历数据结构和嵌套类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23282781/