2012-09-18 68 views
1

我們知道靜態上下文不能引用任何類型的任何實例,但main方法會發生什麼,下面的代碼示例如何編譯沒有問題:從它的封閉類的靜態方法中實例化一個內部類

public class MyOuter 
{ 
    public static void main(String[] args) 
    { 
     MyOuter mo = new MyOuter(); // gotta get an instance! 
     MyOuter.MyInner inner = mo.new MyInner(); 
     inner.seeOuter(); 

     //Or 

     MyOuter.MyInner inner = new MyOuter().new MyInner(); 
    } 

    class MyInner 
    { 
     public void seeOuter(){} 
    } 
} 

是不是禁止從它的封閉類中的靜態上下文中實例化內部類?

回答

5

是不是禁止從它的封閉類中的靜態上下文中實例化內部類?

沒有 - 它是被禁止實例化一個內部類沒有封閉類的一個實例。在你的情況,你有封閉類的一個實例:

new MyOuter().new MyInner(); 

這是完全的罰款。

你通常可以矇混過關,而不從一個實例方法指定的封裝類的唯一原因是,它相當於

// Within an instance method 
this.new MyInner(); 

詳情請參閱section 15.9.2 of the JLS。你的構造函數調用是一個「限定類實例創建表達式」。

相關問題