【发布时间】:2015-02-16 12:42:21
【问题描述】:
我有一个关于在以下代码中使用静态内部类的问题,改编自 Eckel 的 Thinking in Java 第 4 版(第 625 页)。
代码使用名为 Node.js 的静态内部类。当您创建堆栈结构时,您可以将节点推送到堆栈上并将它们弹出 - 到目前为止一切都很好。但是我很困惑为什么节点类是静态的?那不是意味着在 LinkedStack 类中只会创建一个 Node 吗?实际上,您如何/为什么可以将许多不同的节点推入堆栈,然后将它们弹出(这当然是堆栈应该做的)。其实你可以把private static class Node改成'private class Node`,也可以用……那Eckels为什么选择静态类Node呢?
在这个例子中,输入是三个词“Phasers”、“on”、“stun!”输出是“stun!”、“on”、“Phasers”。
public class LinkedStack<T> {
//generic inner class node
private static class Node<U> {
U item;
Node<U> next;
Node() {
item = null;
next = null;
}
Node(U item, Node<U> next) {
this.item = item;
this.next = next;
}
boolean isDummyNode() {
return item == null && next == null;
}
}
//initialize top of stack as a dummy first node
private Node<T> top = new Node<T>();
public void push(T item) {
top = new Node<T>(item, top);
}
public T pop() {
T result = top.item;
if(!top.isDummyNode())
top = top.next;
return result;
}
public static void main(String[] args) {
LinkedStack<String> stack = new LinkedStack<String>();
for(String s : "Phasers on stun!".split(" "))
stack.push(s);
String s;
while((s = stack.pop()) != null)
System.out.println(s);
}
}
【问题讨论】:
-
其他问题没有我的答案。另外,我显然正在阅读和研究,因为这些问题来自 Eckel 关于 Java 的书。我可以对您的决定提出上诉吗?
-
我对为什么节点类是静态的感到困惑?这在重复的 Q/A 中有解释。 这不意味着在 LinkedStack 类中只会创建一个 Node 吗? 这是一个类,你可以创建一个类的许多实例,不管它是顶级类还是内部类(这是不是火箭科学)。 实际上您如何/为什么可以将许多不同的节点推入堆栈...它们是实例,您可以使它们按您的意愿运行。有了这一切,你的问题归结为为什么节点类是静态的?这可以通过阅读 dup 来回答。
-
@topsail:在上诉时,任何在 java 中拥有金徽章的用户都可以重新打开它。或编辑问题会将其发送到重新打开审核队列。但我认为 Luiggi 的链接答案应该可以解决您的问题,前提是您可以放弃对关键字
static的错误理解。 -
@topsail 您将
static class与static类的成员(字段或方法)混淆了。static类类似于顶级类,但在类中声明。为什么要这样做?好吧,假设您只是不希望您的LinkedStack类的客户可以任意创建Node并与它们一起玩,因此声明public class不是一个好主意,而将其声明为简单的class(默认包)仍然可以访问同一包中的类,因此您可以将其声明为LinkedStack内的private static class以将Node的使用限制为仅限LinkedStack。 -
@tgkprog 这是一个很好的例子来了解定义
private static classes 的好处,请查看我上面的评论。
标签: java