为什么我会得到“不能从静态上下文中引用的非静态变量”?

2022-09-03 13:08:12

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

非静态变量,无法从静态上下文中引用

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

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();
    }
}

为什么会发生这种情况?


答案 1

您的嵌套类(顺便说一句,它不是子类)没有标记为静态,因此它是一个内部类,需要编码类(JavaApp1)的实例才能构造它。

选项:

  • 使嵌套类成为静态
  • 使它不是一个内部类(即根本不在内部)JavaApp1
  • 创建一个实例作为“封闭实例”:JavaApp1

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

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

有关内部类的更多信息,请参见 JLS 的 8.1.3 节


答案 2

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

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


推荐