为什么非静态变量不能从静态上下文引用 - 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的实例。

从文档:

若要实例化内部类,必须先实例化外部类 .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();

应该工作!

最新更新