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

时间:2012-11-14 05:59:03

标签: java inner-classes

  

可能重复:
  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类?

6 个答案:

答案 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

类Node

像这样,

    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(); 
}