可能重复:
无法从静态上下文引用非静态变量(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();
}
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,它会给我一个错误,因为我试图从静态方法访问非静态类.精细.例如,如果我Hello在另一个文件中有相同的类,并且我做同样的事情,它不会给我一个错误.
即使在这种情况下,我们也试图从静态方法访问非静态类.但这并没有给出任何错误.为什么?
在这个例子中,它会给我一个错误,因为我试图从静态方法访问非静态类.
不,它会因为你想创建一个实例给你一个错误的内部类(其中隐含有封装类的一个实例的引用),当你不具备封闭类的一个实例.
问题不是调用fun()- 它是构造函数调用.
例如,您可以使用以下方法解决此问题:
DemoJava demo = new DemoJava();
Hello hello = demo.new Hello();
Run Code Online (Sandbox Code Playgroud)
或者你可以通过将类声明更改为:来使它成为嵌套但不是内部类:
public static class Hello
Run Code Online (Sandbox Code Playgroud)
有关内部类的更多信息,请阅读JLS的8.1.3 节 ;有关为类实例创建表达式确定封闭实例的部分,请阅读第15.9.2节:
否则,C是内部成员类(第8.5节),然后:
如果类实例创建表达式是非限定类实例创建表达式,则:
- 如果类实例创建表达式发生在静态上下文中,则会发生编译时错误.
小智 6
是的,它会给你错误,正确的做法是
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7026 次 |
| 最近记录: |