无法从静态上下文引用非静态类

Bin*_*Bin 40 java inner-classes

可能重复:
为什么我得到"无法从静态上下文引用的非静态变量"?

这是代码

public class Stack
{
    private class Node{
        ...
    }
    ...
    public static void main(String[] args){
         Node node = new Node(); // generates a compiling error
    }
}  
Run Code Online (Sandbox Code Playgroud)

错误说:

无法从静态上下文引用非静态类Node

为什么我不应该在main()方法中引用Node类?

Emi*_*Sit 58

Java中的非静态嵌套类包含对父类实例的隐式引用.因此,为了实例化a Node,你还需要一个实例Stack.在静态上下文(主方法)中,没有Stack要引用的实例.因此编译器表明它不能构造一个Node.

如果你创建Node一个静态类(或常规外部类),那么它将不需要引用,Stack并且可以直接在静态main方法中实例化.

有关详细信息,请参阅Java语言规范,第8章,例如Example 8.1.3-2.

  • `Node x = new Stack().new Node();`是解决这个问题的另一种方法,但我发现当我制作**Stack**类**泛型** - Stack <Item>时,编写如下代码:`Node x = new Stack <String>().new Node();`,使用相同的错误消息再次出错.你知道为什么吗? (4认同)
  • +1很棒的解释. (3认同)

Sub*_*der 11

非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有.静态嵌套类无权访问封闭类的其他成员.作为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();
    }
Run Code Online (Sandbox Code Playgroud)

要么

public class Stack
{
    private class Node{
        ...
    }
    ...
    ...
    ...  

    public static void main(String[] args){
             Node node = new Stack().new Node(); 
    }
}  
Run Code Online (Sandbox Code Playgroud)