Java 内部类的默认构造函数是否需要外部类的对象?

Java 内部类的默认构造函数是否需要外部类的对象?,java,reflection,Java,Reflection,我在摆弄java,创建了两个类,Outer和Inner public class Outer { public class Inner { } } 内部类正在使用默认构造函数。我可以在Outer内部创建internal类的新实例,只需调用非参数的默认构造函数newinternal()。但当我尝试使用反射做同样的事情时,我注意到构造函数需要Outertype对象 这是否意味着内部类默认构造函数不是非参数?为什么以正常方式调用构造函数和反射之间存在脱节?您的内部类不是静态的,因此

我在摆弄java,创建了两个类,
Outer
Inner

public class Outer {
    public class Inner { 
    }
}
内部类正在使用默认构造函数。我可以在
Outer
内部创建
internal
类的新实例,只需调用非参数的默认构造函数
newinternal()
。但当我尝试使用反射做同样的事情时,我注意到构造函数需要
Outer
type对象


这是否意味着内部类默认构造函数不是非参数?为什么以正常方式调用构造函数和反射之间存在脱节?

您的内部类不是静态的,因此只有当您有外部对象时,您才能创建内部实例。

没有“以正常方式调用构造函数和反射之间的脱节”,仅在从
外部
类内部调用构造函数和从
外部
类外部调用构造函数之间

由于
内部
类不是
静态
,因此它引用了
外部
。如果要从
外部
的外部创建
内部
的实例,必须这样编写:

Outer outerObj = new Outer();
Outer.Inner innerObj = outerObj.new Inner();
internal
的构造函数提供
outerObj
的要求与通过反射实例化
internal
类时完全相同。唯一的区别是语法将
outerObj
放在操作符
new
的左侧,而反射将
outerObj
传递给构造函数。Java编译器将一个隐藏参数添加到它自动生成的构造函数中,就像它将一个隐藏字段添加到生成的类中,以便保存对
外部
对象的引用一样

请注意,这仅适用于非静态内部类。当内部类是静态的时,没有隐藏参数和隐藏字段,因此反射允许您创建内部类的实例,而不需要外部对象

我可以通过调用非参数的默认构造函数new internal()在Outer中创建内部类的新实例

内部是,但his不会在外部编译,也不会从
Outer
的静态方法编译:

new Outer.Inner();
这是因为当您调用
new internal()
inside
Outer
时,此
会隐式传递给构造函数,以便:

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);
    }
}
外部
的隐藏引用允许内部调用
外部
上的方法,就好像它们是自己的一样