2012-11-14 117 views
28

可能重复:
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()方法为什么不应该参考节点类引用?

+0

“节点”应该*不*是一个内部类“堆栈”的。恕我直言... – paulsm4

+0

@ paulsm4为什么不呢? – anthropomorphic

回答

42

Java中的非静态的嵌套类包含与母体的实例的隐式引用类。因此,为了实例化Node,您还需要具有Stack的实例。在静态上下文中(主要方法),没有提到Stack的实例。因此,编译器指出它不能构造一个Node

如果您Node静态类(或定期外类),那么就不会需要Stack的引用,并可以在静态main方法直接实例化。

参见Java Language Specification, Chapter 8对于细节,如实施例8.1.3-2。

+1

+1很好的解释。 –

+2

'Node x = new Stack()。new Node();'是解决这个问题的另一种方法,但是我发现当我制作** Stack **类时**通用** - Stack ,代码如下:'Node x = new Stack ().new Node();',它再次出现错误,并显示相同的错误消息。你知道为什么吗? – Bin

+0

@zbjosh尝试输入'x'作为'Stack .Node'。 –

2

让你(Node)类static

private static class Node { 
+1

我知道了,但你能详细解释一下吗? – Bin

+0

您无法从静态上下文访问非静态成员。主要方法是静态的,而Node是非静态的。因此,您可以使用外部类的实例来实例化非静态内部成员类。但是,在这种情况下,我认为将它变为静态会更有意义。您只需要一个可以坚持外部“类”的Node的定义,并且您仍然可以在需要时实例化它,而无需拥有外部类的实例。 –

2

或者你也可以声明类节点以外的public class Stack

像这样

public class Stack 
    { 

     public static void main(String[] args){ 
      Node node = new Node();   
}   
    } 
    class Node{ 

    } 
9

非静态内部类(内部类)可以访问封闭类的其他成员,即使它们是十二进制私人化。静态嵌套类不能访问封闭类的其他成员。作为OuterClass的成员,可以将嵌套类声明为private,public,protected或package private。

要实例化一个内部类,必须首先实例化外部类。然后,创建外部对象内的内对象与此语法:OuterClass.InnerClass innerObject = outerObject.new InnerClass();

public static void main(String[] args){ 
     Stack stack = new Stack(); 
     Node node = stack.new Node(); 
    } 

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

    public static void main(String[] args){ 
      Node node = new Stack().new Node(); 
    } 
} 
+0

它看起来很棘手...... – Bin

+0

我测试了它,但是它的错误信息是相同的...... – Bin

+0

错误是什么? “ –

0

如果您使用Eclipse IDE,则将鼠标悬停在错误上时会看到解释。它应该这样说:

没有可以访问类型堆栈的封闭实例。必须用封闭的Stack类型实例来限定分配(例如x.new A(),其中x是Stack的一个实例)。

这里是工作的代码

public static void main(String[] args){ 
    Stack stack = new Stack(); 
    Node node = stack.new Node(); 
} 
1

Java有two types of nested member classes:静态和非静态(又名内)。 Node类是一个非静态嵌套类。为了创建一个Node的实例,你必须有一个Stack的实例:

Stack s = new Stack(); 
Node n = s.new Node(); 
相关问题