2012-10-16 35 views
1

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

请帮

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

回答

10

类需要的的实例的引用阶级为了被构建。如果你的类没有逻辑上需要一个,然后用修改器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

感谢队友:)真的很感谢这个......你能解释这一点,请 “内部类需要在外部类的一个实例的引用为了被构建。“ –

+0

+1非静态嵌套类具有对其外部类的隐式引用,如果没有它,则不能创建它。 –

1

使内部类中加入static关键字像

public static class Class2 

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

1

访问内部类就像访问您班级的其他常规方法一样。

所以,就像你需要你的类的instance参考访问其方法,同样需要在外部类的一个实例的引用,以实例化内部类: -

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

或者,替代是,你可以让你的内部类static,在这种情况下,它被称为nested class,那么你可以使用你原来的方式: -

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

} 
相关问题