簡體   English   中英

為什么在調用子 class 構造函數時調用超級捐贈問題?

[英]why calling super giving issue while callin in child class constructor?

為什么說

錯誤No enclosing instance of type Demo is available due to some intermediate constructor invocation

class Demo {
    
    class DemoInner{
        
        DemoInner(){
            
            System.out.println("DemmoInner");
        }
        
    }

}


public class Noding extends Demo.DemoInner{

    Noding(){
        
        super();
        System.out.println("Noding");
    }
    
    
    public static void main(String[] args) {
        
        new Noding();
        
    }
}

NodingDemo.DemoInner的子對象,而Demo.DemoInnerDemo class 的實例事物。

因此,在創建子Noding實例時,調用super不應該出現問題,因為在創建子節點之前父節點應該已經存在。 在這種情況下,父節點是Demo.DemoInner用於NodingDemo.DemoInner不能沒有Demo存在。

那么為什么在Noding構造函數中調用super()時會出錯呢?

對內部 class 的調用是這樣調用的:

class Noding extends Demo {

    public static void main(String[] args) {

        Demo demo = new Demo();
        Demo.DemoInner inner = demo.new DemoInner();

        System.out.println(inner);
    }
}

除非它被聲明為static ,否則它是動態的,即 object 需要被實例化。

如果你這樣聲明 DemoInner:

class Demo {
    class DemoInner{}
}

這意味着 DemoInner class 是 Demo 的實例之一。 所以在使用DemoInner class時,需要先實例化Demo class。 並以 Demo 實例的成員 object 的身份訪問 DemoInner(請參閱 @AlexeyKonovalov 的回答)。

或者一種解決方法是制作 DemoInner static (正如@RobOhRob 評論的那樣)。 一旦聲明了 static,就不再是外 class Demo ZA8CFDE6331BD54B662AC96F8911C 的成員 object。 無論外部 class 是否被實例化,您都可以訪問 DemoInner class。

class Demo {
    static class DemoInner{}
}

將 DemoInner 設為 static class 將使代碼運行。 DemoInner 是一個非靜態內部 class,因此它與 Demo class 的實例相關聯。

如果不創建 class static,則無法從 Noding 調用其構造函數。

class Demo {
    static class DemoInner{        
        DemoInner(){
            System.out.println("DemmoInner");
        }
    } 
}

public class Noding extends Demo.DemoInner{
    Noding(){
        super();
        System.out.println("Noding");
    }

public static void main(String[] args) {
        new Noding();   
    }
}

暫無
暫無

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

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