一尘不染

为什么会出现“无法从静态上下文引用的非静态变量”?

java

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

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

另一方面,当我将sublass 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();
    }
}

为什么会这样呢?


阅读 265

收藏
2020-09-08

共1个答案

一尘不染

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

选项:

  • 使嵌套类静态
  • 使其不是内部类(即完全不在内部JavaApp1
  • 创建一个实例JavaApp1作为“封闭实例”:
    GenTest x = new JavaApp1().new GenTest();
    

就我个人而言,我会采用第二种方法-
Java中的嵌套类在它们周围有一些怪异之处,因此除非您有充分的理由将其嵌套,否则我将使用顶级类。(IMO的最终选择特别麻烦。)

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

2020-09-08