2

我还是 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

4 回答 4

11

内部类需要引用外部类的实例才能构造。如果您的类在逻辑上不需要它,那么使用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();

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

于 2012-10-16T11:31:34.187 回答
1

通过添加 static 关键字使内部类成为静态的

public static class  Class2

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

于 2012-10-16T11:32:56.747 回答
1

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

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

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

或者,另一种选择是,您可以制作您的内部类static,在这种情况下它被称为 a nested class,那么您可以使用您原来的方式:-

public static class Class2{
    public void newMethod(){
        System.out.println("Second class");
    }
}
于 2012-10-16T11:33:00.927 回答
1

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

  1. “main()”不适合任何复杂的逻辑。您不能从中调用任何在类中不是静态的方法。“main()”仅用于启动应用程序,

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

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

这是一个例子:

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");
        }
    }

}
于 2012-10-16T12:29:57.117 回答