2015-06-27 161 views
4

如果我們有一個代碼...成員java中的嵌套類?

public class Hello 
{ 
    public static void main(String args[]) 
    { 
     Outer obj=new Outer(); 
     obj.method1(); 
    } 
} 

class Outer 
{ 
    void method1() 
    { 
     class Inner 
     { 
     } 
    } 
} 

我想知道,當內部類將被類加載器加載。 在調用method1()時或在我們將創建它的實例時加載它嗎?而Inner類在method1()中沒有執行任何操作,它是一個空類。另外,我想知道,如何在上面的例子中創建一個內部類的實例?

+1

的可能重複的[是否在Java類加載器負載內部類?] (http://stackoverflow.com/questions/24538509/does-the-java-classloader-load-inner-classes) –

+0

在你創建它的實例時。 –

+0

@RajMalhotra請閱讀:[當某人回答我的問題時該怎麼辦](http://stackoverflow.com/help/someone-answers) – CKing

回答

0

要實現內部類,無論如何您都需要對象。如果你像這樣調用method1(),那麼內部類永遠不會被調用。

但是,如果您在method1()或public Outer()構造函數中定義了一些對象,則可以從內部類中獲取結果。

1

從JLS的Section 12.4.1引用:

T是一個類和實例:

類或接口類型T將在以下中的任何一個的 第一次出現之前立即初始化的T被創建。

調用由T聲明的靜態方法。

指定由T聲明的靜態字段。

使用由T聲明的靜態字段,該字段不是常量 變量(§4.12.4)。

T是頂級類(§7.6),並且在T(§8.1.3)中進行詞彙嵌套的斷言語句(§14.10) 被執行。

因此,一個類(不管是否是嵌套類)將遵循相同的規則。在你的具體情況下,Inner將不會被加載,直到類的一個實例被創建。

要回答你的第二個問題,你只可以在裏面method1創建Inner一個實例,因爲Inner是一個方法的局部類,其範圍僅限於method1

void method1() 
{ 

    class Inner 
    { 
     public Inner() 
     { 
      System.out.println("inner()"); 
     } 
    } 

    Inner inner = new Inner(); 
} 
2

Outer.Inner將第一次加載另一個將其引用爲變量類型,方法參數類型,方法返回類型,超類類型,類型參數綁定,或初始化程序或靜態方法的目標類型或靜態變量引用的宿主類的類。在你的例子中,我希望它永遠不會被加載。

另外,我想知道,如何在上面的例子中創建一個內部類的實例?

因爲它是寫,類Outer.Inner是僅內部方法Outer.method1()訪問,因此它可以只在該方法被實例化。在那裏,你可以使用new Inner()。如果你希望它是實例化從其他地方然後移動它的聲明出來的方法體:

class Outer 
{ 
    class Inner 
    { 
    } 

    void method1() 
    { 
    } 
} 

這是一個名爲類更好的形式反正。加載Outer.Inner時或不管它是否會更改。

通過該更改,您可以在Outer的構造函數或實例方法內的任何地方通過new Inner()的形式實例化Outer.Inner。但是,如果您想要從不同的類或者類Outer的靜態方法中實例化一個,那麼它有點棘手。要認識到的重要一點是,Outer.Inner的每個實例都需要一個關聯的實例Outer。這是從上下文確定當在Outer實例方法進行實例化,但是,如果它是在沒有這樣的背景下進行的,則語法是:

public static void main(String args[]) 
    { 
     Outer obj=new Outer(); 
     Outer.Inner inner = obj.new Outer.Inner(); 
    }