簡體   English   中英

內部類的默認構造函數是否需要外部類的對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM