Java 无法从静态上下文引用非静态类
可能重复:Java 无法从静态上下文引用非静态类,java,inner-classes,Java,Inner Classes,可能重复: 这是密码 public class Stack { private class Node{ ... } ... public static void main(String[] args){ Node node = new Node(); // generates a compiling error } } 错误显示: 无法从静态上下文引用非静态类节点 为什么不在main()方法中引用Node类?使(N
这是密码
public class Stack
{
private class Node{
...
}
...
public static void main(String[] args){
Node node = new Node(); // generates a compiling error
}
}
错误显示:
无法从静态上下文引用非静态类节点
为什么不在main()方法中引用Node类?使(Node
)类static
private static class Node {
或者您可以在
公共类堆栈的外部声明类节点
这样,
public class Stack
{
public static void main(String[] args){
Node node = new Node();
}
}
class Node{
}
非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其他成员。作为OuterClass的成员,嵌套类可以声明为private、public、protected或package private
要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:OuterClass.InnerClass innerObject=outerObject.new InnerClass()代码>
或
Java中的非静态嵌套类包含对父类实例的隐式引用。因此,要实例化节点
,还需要有堆栈
的实例。在静态上下文(主方法)中,没有可引用的Stack
实例。因此,编译器指示它不能构造节点
如果将节点
设置为静态类(或常规外部类),则它不需要对堆栈
的引用,可以直接在static main方法中实例化
有关详细信息,请参见,例如示例8.1.3-2。如果使用Eclipse IDE,将鼠标悬停在错误上方时将看到解释。应该这样说:
无法访问Stack类型的封闭实例。必须使用Stack类型的封闭实例限定分配(例如x.new A(),其中x是Stack的实例)
这是工作代码
public static void main(String[] args){
Stack stack = new Stack();
Node node = stack.new Node();
}
Java有:静态和非静态(也称为内部)。节点
类是一个非静态嵌套类。要创建节点的实例
,必须有堆栈的实例
:
Stack s = new Stack();
Node n = s.new Node();
我知道,但您能详细解释一下吗?您不能从静态上下文访问非静态成员。主方法是静态的,而节点是非静态的。因此,您可以使用外部类的实例来实例化非静态内部成员类。但是,在这种情况下,我认为将其设置为静态更有意义。您只需要一个节点定义,它可以与外部“类”保持一致,并且您仍然可以在需要时实例化它,而不需要外部类的实例。“节点”不应该是“堆栈”的内部类。IMHO…我测试了它,但它有相同的错误消息…“非静态类节点不能从静态上下文引用”,我不知道为什么?Node x=new Stack().new Node()
是解决此问题的另一种方法,但我发现,当我将Stack类设为泛型--Stack,并编写如下代码:Node x=new Stack().new Node()代码>,再次出现错误,并显示相同的错误消息。你知道为什么吗?@zbjosh尝试键入x
asStack.Node
@PaulBellora,谢谢,它可以工作!!但是…这里面有什么问题it@Bin问题是,每次需要单个节点对象时,都会实例化整个堆栈,这是对资源和垃圾收集的浪费。
public static void main(String[] args){
Stack stack = new Stack();
Node node = stack.new Node();
}
Stack s = new Stack();
Node n = s.new Node();