簡體   English   中英

實例化非靜態內部類

[英]Instantiating non static inner classes

大家好,我正在嘗試實例化一個名為 AdminHR 的內部類,外部類是抽象的 Administrator。

使用這個語法,Administrator.AdminHR OBj =OBj.new AdminHR();

但它說 OBj 尚未初始化。 有沒有人有什么建議?

內部類可以標記為static 如果是,則一切正常(實際上,您應該始終將所有內部類設為static除非您真的知道自己在做什么並且經過深思熟慮)。 如果他們不是,在你的情況下,AdminHR 不是,好吧:

  1. 這個類默默地擁有外部的所有泛型,但有點狡猾/不可見,並且以一種非常煩人的方式。 真的,您可能應該將事物重寫為靜態以避免不可避免的混亂,並且......

  2. 有一個不可見的字段,屬於您的外部類的類型,它是final 構造函數有一個外部類類型的不可見參數,用於設置該字段。 您可以在內部類中通過表達式OuterClass.this引用此字段。 編譯器將在任何實例方法調用或對外部類的字段訪問之前默默地插入 this。

當您在外部類內部的“實例上下文”中調用new InnerClass()時(例如,外部類中的非靜態方法),那么this將無形地傳遞給那個不可見的第一個參數。 到現在為止還挺好。

當您不在這樣的上下文中時,您實際上需要有一個外部實例來傳遞該不可見參數以設置不可見字段。 其語法非常時髦,它的: instanceOfOuter.new NonStaticInnerType()

您正在代碼片段中嘗試此操作,但是,正如編譯器正確報告的那樣,OBj 未初始化。 事實上,OBj 甚至不是正確的類型(它應該是 Administator,而不是 AdminHR)。

解決方案是:

Administrator admin = new Administator();
Administrator.AdminHR hr = admin.new AdminHR();

或者,如果您已經在 Administator 類中的非靜態方法中,只需:

Administrator.AdminHR hr = new AdminHR();

或者更有可能,忘記非靜態內部類,那是一些火箭科學奇異的 Java。 通過使 AdminHR 本身成為靜態來解決問題。 如果您仍然需要從 Administator 引用實例內容,請明確該不可見字段,例如:

public class Administator {
    public static class AdminHR {
        private final Administrator admin;

        public AdminHR(Administrator admin) {
            this.admin = admin;
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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