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
as
Stack.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();