【问题标题】:non-static class cannot be referenced from a static context [duplicate]不能从静态上下文中引用非静态类[重复]
【发布时间】:2012-11-02 15:38:01
【问题描述】:

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

【问题讨论】:

  • “节点”应该是“堆栈”的内部类。恕我直言...

标签: java inner-classes


【解决方案1】:

让你的 (Node) 类 static

private static class Node {

【讨论】:

  • 我知道,但是你能详细解释一下吗?
  • 您不能从静态上下文访问非静态成员。 main 方法是静态的,而 Node 是非静态的。因此,您可以使用外部类的实例来实例化非静态内部成员类。但是,在这种情况下,我认为将其设为静态会更有意义。您只需要一个可以坚持外部“类”的节点定义,并且您仍然可以在需要时实例化它,而无需拥有外部类的实例。
【解决方案2】:

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

这样,

    public class Stack
    {

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

    }

【讨论】:

    【解决方案3】:

    非静态嵌套类(内部类)可以访问封闭类的其他成员,即使它们被声明为私有。静态嵌套类无权访问封闭类的其他成员。作为 OuterClass 的成员,嵌套类可以声明为私有、公共、受保护或包私有。

    要实例化内部类,必须先实例化外部类。然后,使用以下语法在外部对象中创建内部对象: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(); 
        }
    }  
    

    【讨论】:

    • 我测试了一下,还是一样的报错信息。。。
    • “不能从静态上下文引用非静态类节点”,不知道为什么?
    【解决方案4】:

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

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

    详情请参阅Java Language Specification, Chapter 8,例如示例 8.1.3-2。

    【讨论】:

    • Node x = new Stack().new Node(); 是解决这个问题的另一种方法,但是我发现当我制作 Stackgeneric -- Stack , 并编写如下代码:Node x = new Stack<String>().new Node();,同样的错误信息又是错误的。你知道为什么吗?
    • @zbjosh 尝试将x 输入为Stack<String>.Node
    • @PaulBellora,谢谢,它有效!但是……有什么问题
    • @Bin 问题是每次你想要一个 Node 对象时,你都在实例化整个 Stack,这是对资源和垃圾回收的浪费。
    【解决方案5】:

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

    Stack 类型的封闭实例不可访问。必须使用 Stack 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 Stack 的实例)。

    这是工作代码

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

    【讨论】:

      【解决方案6】:

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

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

      【讨论】:

        猜你喜欢
        • 2023-03-31
        • 2023-03-22
        • 1970-01-01
        • 2023-03-15
        • 2011-05-12
        • 2013-12-02
        相关资源
        最近更新 更多