Java 为什么我会得到;非静态变量不能从静态上下文中引用此变量;?

Java 为什么我会得到;非静态变量不能从静态上下文中引用此变量;?,java,compiler-errors,subclass,non-static,Java,Compiler Errors,Subclass,Non Static,我有一个非常简单的类,我想用它作为另一个类的子类。但当我将其代码放入父类时,我得到: 非静态变量不能从静态上下文引用此变量 另一方面,当我将子类GenTest的类代码放在“parent's”类代码-JavaApp1之外时,我没有得到这个错误 public class JavaApp1 { class GenTest { @Deprecated void oldFunction() { System.out.println("d

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

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

另一方面,当我将子类
GenTest
的类代码放在“parent's”类代码-
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


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

GenTest
是一个非静态类,因此必须在
JavaApp1
的实例中实例化。如果您执行了
静态类GenTest
您所做的工作,否则您需要创建
JavaApp1
的实例,并在非静态方法中创建
GenTest

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

选项:

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

就我个人而言,我会使用第二种方法——Java中的嵌套类有一些奇怪之处,因此我会使用顶级类,除非您有充分的理由将其嵌套。(国际海事组织,最后的选择尤其混乱。)


有关内部类的更多信息,请参阅。

Thar's,因为GenTest是在JavaApp1的上下文中定义的。因此,除非有JavaApp1的实例,否则可以引用它。将其更改为
静态类
,以使其正常工作

静态类GenTest…

请使用

static class GenTest()......

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

GenTest x=newjavaapp1().new GenTest()


使用它,您的类将正确编译。

该类是嵌套的,这意味着您的嵌套类不是静态的,这意味着您必须通过主类的对象为嵌套类创建一个对象。这意味着你的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();
}
Java在线

值得一提的是,GenTest不是JavaApp1的子类。它是一个嵌套类。不同之处在于子类继承父类的公共属性和受保护属性,只需将GenTest放在自己的文件中即可。没有必要将其嵌套在JavaApp1中。Jon Skeet仍然使用JPad。因为我的问题Maven@hellboy我不太清楚你评论的背景是什么——它与这个答案或问题有什么关系?
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();
}
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();
    }

}