为什么我得到"无法从静态上下文引用的非静态变量"?

Pat*_*ryk 15 java compiler-errors subclass non-static

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

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

另一方面,当我把子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();
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Jon*_*eet 19

您的嵌套类(这不是一个子类,顺便)未被标记为静态的,因此它是一个这要求编码类(JavaApp1)的一个实例,以构建它的类.

选项:

  • 使嵌套类静态
  • 使它不是一个内部阶级(即根本不在内部JavaApp1)
  • 创建一个JavaApp1"封闭实例"的实例:

    GenTest x = new JavaApp1().new GenTest();
    
    Run Code Online (Sandbox Code Playgroud)

个人而言,我会用第二种方法去 - 嵌套类在Java中有他们周围的几个古怪,所以我会使用的顶级类,除非你有一个很好的理由,使其嵌套.(最终选择特别混乱,IMO.)

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