1

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

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

4

5 回答 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();
    }
}
于 2013-01-30T10:04:08.490 回答
6

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

不,它会给你一个错误,因为当你没有封闭类的实例时,你试图创建一个内部类的实例(它隐式地引用了封闭类的一个实例) 。

问题不在于调用fun()- 它是构造函数调用。

例如,您可以使用以下方法解决此问题:

DemoJava demo = new DemoJava();
Hello hello = demo.new Hello();

或者您可以通过将声明更改为:

public static class Hello

阅读JLS 的第 8.1.3 节了解有关内部类的更多信息,阅读第 15.9.2 节了解确定类实例创建表达式的封闭实例:

否则,C 是内部成员类(第 8.5 节),然后:

  • 如果类实例创建表达式是非限定类实例创建表达式,则:

    • 如果类实例创建表达式出现在静态上下文中,则会发生编译时错误。
于 2013-01-30T09:55:46.360 回答
3

您必须创建一个实例,Outer class以便创建您的inner class.

文档

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

句法:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();

DemoJava demoInst=new DemoJava();
Hello hello = demoInst.new Hello();
        hello.fun();
于 2013-01-30T09:55:01.420 回答
1

使类Hello静态

public static class Hello {

    void fun()
    {
        System.out.println("This is static fun man!!");    
    }
}

您的内部类Hello不需要访问外部类的实例,DemoJava因此可以将其设为静态。

于 2013-01-30T09:56:52.897 回答
0

您始终可以在没有实例的情况下调用类的静态函数

你好.fun();

应该管用!

于 2013-01-30T10:04:01.160 回答