[英]Does default constructor for inner class need an object of an outer class?
我在擺弄Java,並創建了兩個類, Outer
類和Inner
類
public class Outer {
public class Inner {
}
}
內部類正在使用默認構造函數。 我可以通過調用非參數默認構造函數new Inner()
在Outer
創建Inner
類的新實例。 但是當我嘗試使用反射來做同樣的事情時,我注意到構造函數需要Outer
類型對象。
這是否意味着內部類默認構造函數不是non-args? 為什么正常調用構造函數和反射之間不相交?
在“以正常方式調用構造函數和反射之間沒有脫節”,只有在從Outer
類內部和從Outer
類外部調用構造函數之間沒有。
由於Inner
類不是static
,因此它具有對Outer
的引用。 如果要從Outer
外部創建Inner
實例,則必須這樣編寫:
Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();
提供要求outerObj
到的構造函數Inner
是完全一樣的,當你實例化的Inner
通過反射類。 唯一的區別是語法在操作符new
的左側放置了outerObj
,而反射將outerObj
傳遞給了構造函數。 Java編譯器向其自動生成的構造函數中添加了一個隱藏參數,其方式與向已生成的類中添加隱藏字段以保持對Outer
對象的引用相同。
請注意,這僅適用於非靜態內部類。 當內部類為static
,沒有隱藏的參數,也沒有隱藏的字段,因此反射使您可以創建內部類的實例而無需使用Outer
對象。
內部類不是靜態的,因此只有在擁有外部對象時才能創建內部實例。
我可以在外部內部創建新的內部類實例,只需調用非參數默認構造函數new Inner()
里面是的,但他不會編譯外或從一個靜態方法外Outer
:
new Outer.Inner();
這是因為當您在Outer
內部調用new Inner()
, this
隱式傳遞給了構造函數,使得:
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
方法,就好像它們是自己的一樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.