为什么非静态变量不能从静态上下文引用 – reg

可能重复:
无法从静态上下文引用非静态变量(java)

public class DemoJava { public class Hello { void fun() { System.out.println("This is static fun man!!"); } } public static void main(String[] args) { Hello hello = new Hello(); hello.fun(); } } 

在这个例子中,它会给我一个错误,因为我试图从静态方法访问非静态类。 精细。 例如,如果我在另一个文件中有相同的Hello类,并且我做同样的事情,它不会给我一个错误。

即使在这种情况下,我们也试图从静态方法访问非静态类。 但这并没有给出任何错误。 为什么?

在这个例子中,它会给我一个错误,因为我试图从静态方法访问非静态类。

不,它会给你一个错误,因为当你没有封闭类的实例时,你正试图创建一个内部类的实例(它隐含地引用了一个封闭类的实例)。

问题不是对fun()的调用 – 它是构造函数调用。

例如,您可以使用以下方法解决此问题:

 DemoJava demo = new DemoJava(); Hello hello = demo.new Hello(); 

或者你可以通过将类声明更改为:来使它成为嵌套但不是内部类:

 public static class Hello 

有关内部类的更多信息,请阅读JLS的8.1.3 节 ;有关为类实例创建表达式确定封闭实例的第15.9.2节 :

否则,C是内部成员类(第8.5节),然后:

  • 如果类实例创建表达式是非限定类实例创建表达式,则:

    • 如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。

是的,它会给你错误,正确的做法是

 public class DemoJava { public class Hello { void fun() { System.out.println("This is static fun man!!"); } } public static void main(String[] args) { DemoJava demoJava = new DemoJava(); Hello hello = demoJava.new Hello(); //you need to access your inner class through instance object hello.fun(); } } 

你必须按顺序创建一个Outer class的实例来创建你的inner class的实例。

来自文档 :

要实例化内部类,必须首先实例化外部类。

句法:

 OuterClass.InnerClass innerObject = outerObject.new InnerClass(); DemoJava demoInst=new DemoJava(); Hello hello = demoInst.new Hello(); hello.fun(); 

使类Hello静态

 public static class Hello { void fun() { System.out.println("This is static fun man!!"); } } 

你的内部Hello不需要访问外部类DemoJava的实例,因此它可以是静态的。

您总是可以在没有实例的情况下调用类的静态函数

Hello.fun();

应该管用!