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

3
我还不太熟悉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个回答

12

为了构造一个内部类,它需要一个对外部类实例的引用。如果您的类没有逻辑上的需要,那么请使用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
谢谢,伙计 :) 非常感谢...你能解释一下这一点吗?“内部类需要引用外部类的实例才能被构造。” - ŦhųLẩnå FệrñảnDö
非静态嵌套类具有对其外部类的隐式引用,因此不能在没有它的情况下创建。+1 - Peter Lawrey

1
将内部类设置为静态,只需添加static关键字,如下所示:
public static class  Class2

那么它应该可以工作。您不能在非静态上下文中请求任何静态的东西,这些东西是每个类的事情。或者,您可以通过创建对象而不将class2设置为静态来访问它。


1

内部类的访问方式与访问类中其他普通方法的方式相同。

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

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

或者,另一种选择是将您的内部类声明为static,这样它就被称为嵌套类,然后您可以使用原始方式:-
public static class Class2{
    public void newMethod(){
        System.out.println("Second class");
    }
}

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

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接