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

时间:2013-01-30 09:53:33

标签: java class

  

可能重复:
  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类,并且我做同样的事情,它不会给我一个错误。

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

5 个答案:

答案 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的实例。

来自Documentation

  

要实例化内部类,必须首先实例化外部   类。

<强>语法:

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();

应该有用!