为什么非静态变量不能从静态上下文引用 – 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();
应该管用!