可能的重复项:
不能从静态上下文 (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
的实例。
从文档:
若要实例化内部类,必须先实例化外部类 .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();
应该工作!