2015-09-25 82 views
0

我知道內部類是非靜態的,而外部類的靜態方法不能引用它。外部和內部類和靜態方法

我有這段代碼,那是行不通的,我明白爲什麼這行不通。

class OuterClass { 
    class InnerClass{} 
    public static void outherMethod() { 
     InnerClass i = new InnerClass(); 
    } 
} 

但是,我有這個其他的代碼,這是否工作,但我不明白爲什麼它不同於第一個。它爲什麼有效?

class OuterClass { 
    class InnerClass{} 
    public static void outherMethod() { 
     InnerClass i = new OuterClass.new InnerClass(); 
    } 
} 

在此先感謝!

編輯:它不重複,因爲它不是同一個問題。我不是在問靜態嵌套類,我是在詢問靜態方法和內部類

回答

6

內部類總是以被實例化,需要封閉類的一個實例。

OuterClass靜態方法不具有OuterClass一個實例,因此你不能沒有提供(的OuterClass)的類實例創建的InnerClass一個實例。

InnerClass i = new InnerClass(); 

只能從OuterClass的實例方法中使用。從靜態的方法,因爲你正在創建的OuterClass一個實例,並把它作爲封閉實例的InnerClass一個實例中

InnerClass i = new OuterClass().new InnerClass(); 

作品。

3

這裏要注意的關鍵點是Inner類是Outer類的成員。

所以沒有它的一個實例,你不能訪問它的成員。

docs從直接

的將InnerClass實例只能在在OuterClass的實例存在,並且具有的方法和包含它的實例的字段的直接訪問。

要實例化一個內部類,必須首先實例化外部類。然後,創建外部對象內的內對象與此語法:

OuterClass.InnerClass innerObject = outerObject.new InnerClass();