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

45

“Node” 不应该是 “Stack” 的内部类。在我看来... - paulsm4
6个回答

64

Java中的非静态嵌套类包含对父类实例的隐式引用。因此,要实例化一个Node,还需要有一个Stack的实例。在一个静态上下文(主方法)中,没有Stack的实例可以引用。因此编译器指示它无法构造一个Node

如果将Node设置为静态类(或常规外部类),那么它将不需要引用Stack并且可以直接在静态主方法中实例化。

请参见Java语言规范第8章以获取详细信息,例如Example 8.1.3-2。


7
Node x = new Stack().new Node(); 这种写法也可以解决这个问题,但是我发现如果我将 Stack 类变成 泛型 -- Stack<Item>,并写出类似于 Node x = new Stack<String>().new Node(); 的代码时,它仍然会出现相同的错误信息。你知道为什么吗? - Bin
@zbjosh 试着将 x 输入为 Stack<String>.Node - Paul Bellora
@PaulBellora,谢谢,它有效了!但是...它有什么问题呢? - Bin
@Bin 问题在于每次你想要一个单独的Node对象时,都会实例化整个Stack,这样做既浪费资源又造成垃圾回收的负担。 - EntangledLoops

13

非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类不能访问封闭类的其他成员。作为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(); 
    }
}  

我测试了一下,但是出现了相同的错误信息... - Bin
非静态类节点无法从静态上下文中引用,我不知道为什么? - Bin

3
你可以将Node类声明在public class Stack之外。 例如,
    public class Stack
    {

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

    }

3

Java有两种嵌套成员类:静态和非静态(也称为内部类)。Node类是一个非静态嵌套类。要创建一个Node的实例,您必须拥有一个Stack的实例:

Stack s = new Stack();
Node n = s.new Node();

2

将您的 (Node) 类设置为 static

private static class Node {

1
我知道这个,但你能详细解释一下吗? - Bin
你不能从静态上下文访问非静态成员。主方法是静态的,而Node是非静态的。因此,您可以使用外部类的实例来实例化非静态内部成员类。但在这种情况下,我认为将其设置为静态会更有意义。您只需要一个Node的定义,它可以与外部“类”保持一致,并且仍然能够在需要时进行实例化,而无需具有外部类的实例。 - Bhesh Gurung

1
如果您使用Eclipse IDE,当您将鼠标悬停在错误上时,您会看到解释。它应该会显示类似于以下内容:

无法访问类型Stack的封闭实例。必须使用类型Stack的封闭实例限定分配(例如,在Stack的实例x中使用x.new A())。

这是可行的代码。
public static void main(String[] args){
    Stack stack = new Stack();
     Node node = stack.new Node(); 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接