Java 为什么在调用子类构造函数时调用super-giving问题?

Java 为什么在调用子类构造函数时调用super-giving问题?,java,inner-classes,Java,Inner Classes,为什么这么说 错误由于某些中间构造函数调用,没有Demo类型的封闭实例可用 class Demo { class DemoInner{ DemoInner(){ System.out.println("DemmoInner"); } } } public class Noding extends Demo.DemoInner{

为什么这么说

错误
由于某些中间构造函数调用,没有Demo类型的封闭实例可用

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
类的一个实例

因此,在创建子类
Noding
实例时,调用
super
不应该产生问题,因为在创建子类之前父类应该存在。在这种情况下,父级是
Demo.DemoInner
用于
点头
Demo.DemoInner
如果没有
Demo
就不能存在


那么,在
Noding
构造函数中调用
super()
时,为什么会出现给定错误呢?

对内部类的调用是这样调用的:

class Noding extends Demo {

    public static void main(String[] args) {

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

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

除非声明为
静态
,否则它是动态的,即需要实例化对象

如果您这样声明DemoInner:

class Noding extends Demo {

    public static void main(String[] args) {

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

        System.out.println(inner);
    }
}
class Demo {
    class DemoInner{}
}
这意味着DemoInner类是Demo的实例之一。所以,当您使用DemoInner类时,首先需要实例化Demo类。并作为演示实例的成员对象访问DemoInner(请参见@AlexeyKonovalov)

或者一种解决方法是使DemoInner成为静态的(正如@RobOhRob所评论的)。一旦声明为静态,它就不再是外部类Demo对象的成员对象。无论外部类是否实例化,都可以访问DemoInner类

class Demo {
    static class DemoInner{}
}

将DemoInner设置为静态类将使代码运行。DemoInner是一个非静态的内部类,因此它与Demo类的实例相关联

如果不使类保持静态,就不能从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();   
    }
}

使DemoInner成为静态class@RobOhRob解决方案很好,我问它为什么会出现?因为如果不是一个静态类,DemoInner只能在Demo的一个实例中使用。@RobOhRob,这是重点。.如果是这种情况,“DemoInner只能在Demo的一个实例中使用”。那么为什么调用super()在Noding类的构造函数中弹出一个错误?错误不在super上,错误在
extends Demo上。DemoInner
Nice可以添加一个Demo。DemoInner`对象有一个
Demo。此
访问其嵌入的Demo对象。如果
Demo,则不需要使用此
使Demo成为静态。