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

Cha*_*nya 1 java class

可能重复:
无法从静态上下文引用非静态变量(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在另一个文件中有相同的类,并且我做同样的事情,它不会给我一个错误.

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

Jon*_*eet 6

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

不,它会因为你想创建一个实例给你一个错误的内部类(其中隐含有封装类的一个实例的引用),当你不具备封闭类的一个实例.

问题不是调用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)