为什么我得到“无法从静态上下文引用的非静态变量”?
我有一个非常简单的类,我想用它作为另一个的子类。 但是当我把它的代码放在父类的时候,我得到:
非静态变量,不能从静态上下文引用
另一方面,当我将子类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(); } }
为什么会这样?
您的嵌套类(顺便说一下,它不是子类)未标记为静态,因此它是一个内部类,需要编码类(JavaApp1)的实例才能构造它。
选项:
- 使嵌套类静态
- 使它不是内部类(即根本不在
JavaApp1
中) -
创建
JavaApp1
的实例作为“封闭实例”:GenTest x = new JavaApp1().new GenTest();
我个人会采用第二种方法 – Java中的嵌套类有一些奇怪的东西,所以我会使用顶级类,除非你有充分的理由让它嵌套。 (最终选择特别凌乱,国际海事组织。)
有关内部类的更多信息,请参见JLS的8.1.3节 。
它应该是static class GenTest
,因为您从静态方法创建它的实例。
此外,通常,内部类应该是静态的。
GenTest
类是一个非静态类,因此必须在JavaApp1
的实例中实例化。 如果您执行static class GenTest
,则需要创建JavaApp1
实例并在非静态方法中创建GenTest
。
Thar是因为GenTest是使用JavaApp1的上下文定义的。 除非你有一个JavaApp1实例,否则你可以引用它。 将其更改为static class
以使其工作。
static class GenTest...
请用
static class GenTest()......
您调用的方式不是正确的方法。 由于内部类GenTest
是GenTest
的成员,因此调用它的正确方法是
GenTest x = new JavaApp1().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(); }
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