[英]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();
}
}
Noding
是Demo.DemoInner
的子對象,而Demo.DemoInner
是Demo
class 的實例事物。
因此,在創建子Noding
實例時,調用super
不應該出現問題,因為在創建子節點之前父節點應該已經存在。 在這種情況下,父節點是Demo.DemoInner
用於Noding
和Demo.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.