【问题标题】:Why do I get "non-static variable this cannot be referenced from a static context"?为什么我会得到“无法从静态上下文引用的非静态变量”?
【发布时间】:2012-05-05 07:48:54
【问题描述】:

我有一个非常简单的类,我想将它用作另一个类的子类。但是当我把它的代码放在父类中时,我得到:

非静态变量 this 不能从静态上下文中引用

另一方面,当我将子类 GenTest 的类代码放在“父类”类代码之外时 - JavaApp1 我没有收到此错误。

public class JavaApp1 {

    class GenTest {  
        @Deprecated
        void oldFunction() {
            System.out.println("don't use that");
        }
        void newFunction() {
            System.out.println("That's ok.");
        }
    }

    public static void main(String[] args) {
        GenTest x = new GenTest();
        x.oldFunction();
        x.newFunction();
    }
}

为什么会这样?

【问题讨论】:

  • 值得一提的是,GenTest 不是 JavaApp1 的子类。它是一个嵌套类。不同之处在于子类继承其父类的公共和受保护属性。
  • 只需将 GenTest 放在它自己的文件中。无需嵌套在 JavaApp1 中。

标签: java compiler-errors subclass non-static


【解决方案1】:

您的嵌套类(顺便说一下,不是子类)没有被标记为静态的,因此它是一个 inner 类,它需要一个编码类 (JavaApp1) 以便构造它。

选项:

  • 将嵌套类设为静态
  • 使其不是内部类(即根本不在JavaApp1 内)
  • 创建JavaApp1 的实例作为“封闭实例”:

    GenTest x = new JavaApp1().new GenTest();
    

我个人会采用第二种方法 - Java 中的嵌套类有一些奇怪之处,所以我会使用顶级类,除非你有充分的理由让它嵌套。 (最后一个选项特别混乱,IMO。)

有关内部类的更多信息,请参阅section 8.1.3 of the JLS

【讨论】:

  • Jon Skeet 仍然使用 JPad。因为 Maven 的问题
  • @hellboy 我不太确定你评论的上下文是什么——它与这个答案或问题有什么关系?
【解决方案2】:

它应该是static class GenTest,因为你从静态方法创建了它的一个实例。

另外,一般来说,内部类应该是静态的。

【讨论】:

    【解决方案3】:

    GenTest 类是一个非静态类,因此必须在JavaApp1 的实例中实例化。如果你做static class GenTest 你有什么工作,否则你需要创建一个JavaApp1 的实例并在一个非静态方法中创建GenTest

    【讨论】:

      【解决方案4】:

      这是因为 GenTest 是在 JavaApp1 的上下文中定义的。因此,除非您有 JavaApp1 的实例,否则您可以参考它。将其更改为 static class 以使其正常工作。

      static class GenTest...

      【讨论】:

        【解决方案5】:

        请使用

        static class GenTest()......
        

        【讨论】:

          【解决方案6】:

          您调用的方式不是正确的方式。由于内部类GenTestJavaApp1 的成员,因此调用它的正确方法是

          GenTest x = new JavaApp1().new GenTest();

          使用它你的类可以正确编译。

          【讨论】:

            【解决方案7】:

            类是嵌套的,也就是说你的嵌套类不是静态的,也就是说你必须通过主类的对象为嵌套类创建一个对象。这意味着你的 psvm 应该是这样的。

            public static void main(String[] args) {
                JavaApp1 a=new JavaApp1(); //create an object for the main class
                JavaApp1.GenTest x=a.new GenTest();
            
                x.oldFunction();
                x.newFunction();
            }
            

            【讨论】:

              【解决方案8】:
              class Test {
              
                  static class GenTest { // nested class with static
              
                      static void oldFunction() { // static method
                          System.out.println("don't use that");
                      }
                      void newFunction() { // non-static method
                          System.out.println("That's ok.");
                      }
                  }
              
                  public static void main (String[] args) {
                      GenTest.oldFunction(); // call static method
              
                      GenTest two = new GenTest(); // call non-static method
                      two.newFunction();
                  }
              
              }
              

              Java 在线 java

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-12-25
                • 1970-01-01
                • 2013-01-14
                • 2018-01-04
                • 2010-10-29
                • 1970-01-01
                相关资源
                最近更新 更多