Java中的内部类 - 非静态变量错误

时间:2012-10-16 11:29:50

标签: java class inner-classes

我还是java的新手,我试图创建一个内部类并在main中调用该方法。 但是有一个编译错误,说“非静态变量 - 这不能从静态上下文中引用”

请帮忙

class Class1{

    public static void main(String args []){
        Class2 myObject = new Class2();
        myObject.newMethod();
    }

    public class Class2{
        public void newMethod(){
            System.out.println("Second class");
        }
    }
}

4 个答案:

答案 0 :(得分:10)

inner 类需要引用外部类的实例才能构造。如果你的类在逻辑上不需要它,那么使用static修饰符使它“只是一个嵌套类”:

public static class Class2 {
    public void newMethod(){
        System.out.println("Second class");
    }
}

编辑:要创建Class2的实例作为内部类,您可以使用以下内容:

Class1 outer = new Class1();
Class2 myObject = outer.new Class2();

或者更简单地说:

Class2 myObject = new Class1().new Class2();

...但除非你真的希望引用一个封闭的实例,否则让这个类只是一个嵌套类要简单得多。

答案 1 :(得分:1)

通过添加静态关键字(如

)使内部类成为静态
public static class  Class2

然后它应该工作。在非静态上下文中,您不能要求任何静态的东西。或者,您可以通过创建对象来访问它,而不必将class2作为静态对象。

答案 2 :(得分:1)

访问内部类就像访问类的任何其他常规方法一样。

因此,就像你需要引用类的instance来访问它的方法一样,你需要引用外部类的实例来实例化你的内部类: -

Class1.Class2 myObject = new Class1().new Class2();

或者,替代,您可以创建内部类static,在这种情况下称为nested class,然后您可以使用原始方式: -

public static class Class2{
    public void newMethod(){
        System.out.println("Second class");
    }
}

答案 3 :(得分:1)

如果您是Java的新手,下一个示例可能对您有所帮助。

  1. “main()”不适合任何复杂的逻辑。你不能从中打电话 类中不是静态的方法。 “main()”仅适用于启动申请,

  2. 在许多情况下,首先你需要创建类的实例,即 包含方法“main”。例如,它是“OuterClass”。

  3. 当“OuterClass”的实例存在时,您可以从中调用它 任何动态的东西,比如InnerClass对象的InnerClass方法。

  4. 以下是一个例子:

    public class OuterClass {
        public static void main(String args []){
            new OuterClass();   // Instance of First class
        }
    
        public OuterClass () { // constuctor
            InnerClass myObject = new InnerClass();
            myObject.newMethod();
        }
    
        public class InnerClass{
            public void newMethod(){
                System.out.println("Second class");
            }
        }
    
    }