2012-10-16 52 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"); 
     } 
    } 

} 
相關問題