【问题标题】:Why non-static variable cannot be reference from a static context - reg [duplicate]为什么不能从静态上下文引用非静态变量 - reg [重复]
【发布时间】:2013-01-14 02:13:30
【问题描述】:

可能重复:
non-static variable cannot be referenced from a static context (java)

public class DemoJava {

    public class Hello {

        void fun()
        {
            System.out.println("This is static fun man!!");    
        }
    }

    public static void main(String[] args) {

        Hello hello = new Hello();
        hello.fun();
    }
}

在这个例子中,它会给我一个错误,因为我试图从一个静态方法访问一个非静态类。美好的。例如,如果我在另一个文件中有相同的 Hello 类并且我做同样的事情,它不会给我一个错误。

即使在这种情况下,我们也试图从静态方法访问非静态类。但这并没有给出任何错误。为什么?

【问题讨论】:

  • @EJP 我同意这是重复的,但这实际上正确地指出了问题。在该示例中,如果您看到给出了近 100 行的整个代码。指出错误会很困难。这就是为什么我再次发布这个。 :)

标签: java class


【解决方案1】:

您必须创建Outer class 的实例才能创建inner class 的实例。

来自Documentation

要实例化一个内部类,必须先实例化外部类 班级。

语法:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

DemoJava demoInst=new DemoJava();
Hello hello = demoInst.new Hello();
        hello.fun();

【讨论】:

    【解决方案2】:

    在这个例子中,它会给我一个错误,因为我试图从一个静态方法访问一个非静态类。

    不,它会给你一个错误,因为你试图创建一个 inner class 的实例(它隐式地引用了封闭类的一个实例)而你不这样做一个封闭类的实例。

    问题不在于对fun() 的调用——而是构造函数调用。

    例如,您可以使用以下方法解决此问题:

    DemoJava demo = new DemoJava();
    Hello hello = demo.new Hello();
    

    或者你可以把它变成一个嵌套而不是内部类,方法是将类声明改为:

    public static class Hello
    

    阅读section 8.1.3 of the JLS 了解有关内部类的更多信息,阅读section 15.9.2 了解确定类实例创建表达式的封闭实例:

    否则,C 是一个内部成员类(第 8.5 节),那么:

    • 如果类实例创建表达式是非限定类实例创建表达式,则:

      • 如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。

    【讨论】:

      【解决方案3】:

      使类Hello静态

      public static class Hello {
      
          void fun()
          {
              System.out.println("This is static fun man!!");    
          }
      }
      

      您的内部类Hello 不需要访问外部类DemoJava 的实例,因此可以将其设为静态。

      【讨论】:

        【解决方案4】:

        你总是可以在没有实例的情况下调用类的静态函数

        你好.fun();

        应该可以!

        【讨论】:

          【解决方案5】:

          是的,它会给你错误,正确的做法是

          public class DemoJava {
          
              public class Hello {
          
                  void fun()
                  {
                      System.out.println("This is static fun man!!");    
                  }
              }
          
              public static void main(String[] args) {
          
                  DemoJava demoJava = new DemoJava();
                  Hello  hello = demoJava.new Hello(); //you need to access your inner class through instance object
                  hello.fun();
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-05-12
            • 2013-12-02
            • 2013-12-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多