2014-04-04 113 views
1
class Outer { 
    int o = 10; 
    class Inner { 
     int i = 20; 
    }  
} 

public class Demo { 
    public static void main(String args[]) { 
     Outer o = new Outer(); 
     Outer.Inner oi = o.new Inner(); 
    } 
} 

當我們通過外部類對象創建一個內部類對象他們如何在堆中彼此關聯?如何在內存堆中存在java內部類對象?

回答

3

基本上,編譯器隱式創建了一個構造函數,它引用外部類,該外部類存儲在隱藏字段中。所以,你的代碼是有點這樣的:

class Outer { 
    int o = 10; 
    static class Inner { 
     private final Outer outer; 
     int i = 20; 

     Inner(Outer outer) { 
      this.outer = outer; 
     } 
    }  
} 

public class Demo { 
    public static void main(String args[]) { 
     Outer o = new Outer(); 
     Outer.Inner oi = new Outer.Inner(o); 
    } 
} 

(請注意,我已經轉換內部類爲靜態嵌套類。)

+0

爲什麼要將內部類轉換爲靜態嵌套類?謝謝你的答案:) –

+1

@KalhanoToressPamuditha:正確地刪除內部類的複雜性 - 重點是*內部*類具有隱式的構造函數和字段,但*靜態嵌套*類不。所以你可以把它看作編譯器把你的原始代碼轉換成這個代碼,然後編譯只知道靜態嵌套類。 –

+0

是您的代碼的最後一個聲明是否正確?或者它是'Outer.Inner oi = new Outer.Inner(o);' –

0

我覺得喬恩斯基特已經說明了這一點是合乎邏輯的內部類(即哪些包含在任何外部類中)都有對外部類的引用。

但是,我想以不同的方式呈現它。根據James Gosling編寫的標準書籍「Java Programming Language,4th Edition」和

非靜態嵌套類被稱爲內部類。非靜態類成員與類的實例相關聯。非靜態字段是實例變量。

類似地,內類也是(通常)與一類,或更具體地一個「內部類的實例」與 其封閉類的實例相關聯的一個「實例」相關聯。

因此,如果外層類的對象存在於堆中,則關聯的內部類對象也將存在。

但是,我不認爲靜態嵌套類將必然存在於堆關聯與外部類的對象。他們就像其他任何外部獨立階級一樣。