15

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

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

另一方面,当我将 sublassGenTest的类代码放在“父”类代码之外时 -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();
    }
}

为什么会这样?

4

8 回答 8

20

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

选项:

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

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

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

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

于 2012-04-24T16:22:58.523 回答
2

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

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

于 2012-04-24T16:22:18.807 回答
1

该类GenTest是一个非静态类,因此必须在JavaApp1. 如果你做static class GenTest了你已经完成的工作,否则你需要创建一个实例JavaApp1GenTest在非静态方法中创建。

于 2012-04-24T16:22:58.153 回答
1

Thar 是因为 GenTest 是在 JavaApp1 的上下文中定义的。因此,除非您有 JavaApp1 的实例,否则您可以参考它。将其更改为 astatic class以使其正常工作。

static class GenTest...

于 2012-04-24T16:24:11.183 回答
1

请用

static class GenTest()......
于 2012-04-24T16:25:18.780 回答
0

The way you are invoking isn't the correct way to do that. Since the inner class GenTest is a member of the JavaApp1 the correct way to invoke it would be

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

Using it your class would compile correctly.

于 2012-04-24T16:29:19.533 回答
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 在线 java

于 2018-05-28T21:39:00.840 回答
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();
}
于 2017-09-23T02:21:12.957 回答