2015-10-16 109 views
2

我擺弄周圍用java,我創建了兩個班,OuterInner內部類的默認構造函數是否需要外部類的對象?

public class Outer { 
    public class Inner { 
    } 
} 

內部類使用默認構造函數。只需調用非參數的默認構造函數new Inner(),我就可以在Outer內創建Inner類的新實例。但是當我嘗試使用反射做同樣的事情時,我注意到構造函數需要Outer類型的對象。

這是否意味着內部類的默認構造函數不是非參數?爲什麼以正常方式調用構造函數與反射之間存在脫節?

回答

2

沒有「調用正常的方式和反射構造之間的脫節」,只能從Outer類的內部和Outer類之外調用構造函數之間。

由於Inner類不是static,因此它對Outer的引用。如果你想從Outer之外創建的Inner一個實例,你必須把它寫這樣的:

Outer outerObj = new Outer(); 
Outer.Inner innerObj = outerObj.new Inner(); 

要求提供outerObjInner構造是完全一樣的,當你實例Inner類通過如反射。唯一的區別是語法將outerObj放置在運算符new的左側,而反射通過outerObj傳遞給構造函數。 Java編譯器爲它自動生成的構造函數添加一個隱藏參數,就像它向生成的類添加一個隱藏字段以保存對對象的引用一樣。

請注意,這僅適用於非靜態內部類。當你的內部類是static時,沒有隱藏的參數,也沒有隱藏的字段,所以反射可以讓你在沒有Outer對象的情況下創建內部類的實例。

1

您的內部類不是靜態的,所以只有擁有外部對象時纔可以創建內部實例。

1

我可以通過調用非ARGS默認構造函數的新內()

裏面是的,但他不會編譯外外或從靜態裏面創建:外新的類實例的Outer方法:

new Outer.Inner(); 

這是因爲,當你調用new Inner()Outerthis被隱式地傳遞給構造,使得這樣的:

public class Outer { 
    public class Inner { 
    } 

    public example(){ 
     new Inner(); 
    } 
} 

等效於此靜態版本:

public class Outer { 
    public static class Inner { 
     private Outer mOuter; 
     public Inner(Outer outer){ 
      mOuter = outer; 
     } 
    } 

    public example(){ 
     new Inner(this); 
    } 
} 

隱藏參考Outer允許內部到,儘管它們是它自己的調用上Outer方法。

相關問題