Java 内部类的默认构造函数是否需要外部类的对象?
我在摆弄java,创建了两个类,Java 内部类的默认构造函数是否需要外部类的对象?,java,reflection,Java,Reflection,我在摆弄java,创建了两个类,Outer和Inner public class Outer { public class Inner { } } 内部类正在使用默认构造函数。我可以在Outer内部创建internal类的新实例,只需调用非参数的默认构造函数newinternal()。但当我尝试使用反射做同样的事情时,我注意到构造函数需要Outertype对象 这是否意味着内部类默认构造函数不是非参数?为什么以正常方式调用构造函数和反射之间存在脱节?您的内部类不是静态的,因此
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()
insideOuter
时,此
会隐式传递给构造函数,以便:
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);
}
}
对外部
的隐藏引用允许内部调用外部
上的方法,就好像它们是自己的一样