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

时间:2012-04-24 16:20:04

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

为什么会这样?

8 个答案:

答案 0 :(得分:19)

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

选项:

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

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

就个人而言,我会选择第二种方法 - Java中的嵌套类有一些奇怪的东西,所以我会使用顶级类,除非你有充分的理由让它嵌套。 (最终选择特别麻烦,IMO。)

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

答案 1 :(得分:2)

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

此外,通常,内部类应该是静态的。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

Thar,因为GenTest是使用JavaApp1的上下文定义的。除非你有一个JavaApp1实例,否则你可以引用它。将其更改为static class以使其生效。

static class GenTest...

答案 4 :(得分:1)

请使用

static class GenTest()......

答案 5 :(得分:0)

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

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

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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 Online java