可能重复:
Why do I get “non-static variable this cannot be referenced from a static context”?
以下是代码
public class Stack
{
private class Node{
...
}
...
public static void main(String[] args){
Node node = new Node(); // generates a compiling error
}
}
错误说:
无法从静态上下文引用非静态类节点
为什么我不应该在main()方法中引用Node类?
答案 0 :(得分:53)
Java中的非静态嵌套类包含对父类的实例的隐式引用。因此,要实例化Node
,您还需要具有Stack
的实例。在静态上下文(主方法)中,没有Stack
的实例可供引用。因此,编译器指示它无法构造Node
。
如果使Node
成为静态类(或常规外部类),则它不需要对Stack
的引用,并且可以直接在静态main方法中实例化。
有关详细信息,请参阅Java Language Specification, Chapter 8,例如例8.1.3-2。
答案 1 :(得分:10)
非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其他成员。作为OuterClass的成员,可以将嵌套类声明为private,public,protected或package private。
要实例化内部类,必须首先实例化外部类。然后,使用以下语法在外部对象中创建内部对象:OuterClass.InnerClass innerObject = outerObject.new InnerClass();
public static void main(String[] args){
Stack stack = new Stack();
Stack.Node node = new Stack().new Node();
}
或
public class Stack
{
private class Node{
...
}
...
...
...
public static void main(String[] args){
Node node = new Stack().new Node();
}
}
答案 2 :(得分:2)
制作您的{Node
)课程static
private static class Node {
答案 3 :(得分:2)
或者您可以声明public class Stack
像这样,
public class Stack
{
public static void main(String[] args){
Node node = new Node();
}
}
class Node{
}
答案 4 :(得分:2)
Java有two types of nested member classes:静态和非静态(又名内部)。 Node
类是非静态嵌套类。要创建Node
的实例,您必须拥有Stack
的实例:
Stack s = new Stack();
Node n = s.new Node();
答案 5 :(得分:1)
如果您使用Eclipse IDE,则在将鼠标悬停在错误上时会看到解释。它应该说是这样的:
无法访问Stack类型的封闭实例。必须使用Stack类型的封闭实例限定分配(例如x.new A(),其中x是Stack的实例)。
这是工作代码
public static void main(String[] args){
Stack stack = new Stack();
Node node = stack.new Node();
}