可能重复:
non-static variable cannot be referenced from a static context (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
类,并且我做同样的事情,它不会给我一个错误。
即使在这种情况下,我们也试图从静态方法访问非静态类。但这并没有给出任何错误。为什么?
答案 0 :(得分:6)
在这个例子中,它会给我一个错误,因为我试图从静态方法访问非静态类。
不,它会给你一个错误,因为你试图创建一个内部类的实例(它隐含地引用了一个封闭类的实例) 拥有封闭类的实例。
问题不在于对fun()
的调用 - 它是构造函数调用。
例如,您可以使用以下方法解决此问题:
DemoJava demo = new DemoJava();
Hello hello = demo.new Hello();
或者您可以通过将类声明更改为:
来使其成为嵌套但不是内部类public static class Hello
阅读section 8.1.3 of the JLS以获取有关内部类的更多信息,并阅读section 15.9.2以确定类实例创建表达式的封闭实例:
否则,C是内部成员类(第8.5节),然后是:
如果类实例创建表达式是非限定类实例创建表达式,则:
- 如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。
答案 1 :(得分: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();
}
}
答案 2 :(得分:3)
您必须按顺序创建Outer class
的实例才能创建inner class
的实例。
要实例化内部类,必须首先实例化外部 类。
<强>语法:强>
OuterClass.InnerClass innerObject = outerObject.new InnerClass();
DemoJava demoInst=new DemoJava();
Hello hello = demoInst.new Hello();
hello.fun();
答案 3 :(得分:1)
让课程Hello
静态
public static class Hello {
void fun()
{
System.out.println("This is static fun man!!");
}
}
您的内部类Hello
不需要访问外部类DemoJava
的实例,因此可以将其设置为静态。
答案 4 :(得分:0)
您总是可以在没有实例的情况下调用类的静态函数
Hello.fun();
应该有用!